| @@ -4,9 +4,13 @@ | ||
| 4 | 4 | |
| 5 | 5 | use Dudlewebs\WPMCS\s3\Aws\Api\Service; |
| 6 | 6 | use Dudlewebs\WPMCS\s3\Aws\Api\Validator; |
| 7 | 7 | use Dudlewebs\WPMCS\s3\Aws\Credentials\CredentialsInterface; |
| 8 | +use Dudlewebs\WPMCS\s3\Aws\EndpointV2\EndpointProviderV2; | |
| 8 | 9 | use Dudlewebs\WPMCS\s3\Aws\Exception\AwsException; |
| 10 | +use Dudlewebs\WPMCS\s3\Aws\Signature\S3ExpressSignature; | |
| 11 | +use Dudlewebs\WPMCS\s3\Aws\Token\TokenAuthorization; | |
| 12 | +use Dudlewebs\WPMCS\s3\Aws\Token\TokenInterface; | |
| 9 | 13 | use Dudlewebs\WPMCS\s3\GuzzleHttp\Promise; |
| 10 | 14 | use Dudlewebs\WPMCS\s3\GuzzleHttp\Psr7; |
| 11 | 15 | use Dudlewebs\WPMCS\s3\GuzzleHttp\Psr7\LazyOpenStream; |
| 12 | 16 | use Dudlewebs\WPMCS\s3\Psr\Http\Message\RequestInterface; |
| @@ -24,14 +28,28 @@ | ||
| 24 | 28 | */ |
| 25 | 29 | public static function sourceFile(Service $api, $bodyParameter = 'Body', $sourceParameter = 'SourceFile') |
| 26 | 30 | { |
| 27 | 31 | return function (callable $handler) use($api, $bodyParameter, $sourceParameter) { |
| 28 | - return function (CommandInterface $command, RequestInterface $request = null) use($handler, $api, $bodyParameter, $sourceParameter) { | |
| 32 | + return function (CommandInterface $command, ?RequestInterface $request = null) use($handler, $api, $bodyParameter, $sourceParameter) { | |
| 29 | 33 | $operation = $api->getOperation($command->getName()); |
| 30 | 34 | $source = $command[$sourceParameter]; |
| 31 | 35 | if ($source !== null && $operation->getInput()->hasMember($bodyParameter)) { |
| 32 | - $command[$bodyParameter] = new LazyOpenStream($source, 'r'); | |
| 36 | + $lazyOpenStream = new LazyOpenStream($source, 'r'); | |
| 37 | + $command[$bodyParameter] = $lazyOpenStream; | |
| 33 | 38 | unset($command[$sourceParameter]); |
| 39 | + $next = $handler($command, $request); | |
| 40 | + // To avoid failures in some tests cases | |
| 41 | + if ($next !== null && \method_exists($next, 'then')) { | |
| 42 | + return $next->then(function ($result) use($lazyOpenStream) { | |
| 43 | + // To make sure the resource is closed. | |
| 44 | + $lazyOpenStream->close(); | |
| 45 | + return $result; | |
| 46 | + })->otherwise(function (\Throwable $e) use($lazyOpenStream) { | |
| 47 | + $lazyOpenStream->close(); | |
| 48 | + throw $e; | |
| 49 | + }); | |
| 50 | + } | |
| 51 | + return $next; | |
| 34 | 52 | } |
| 35 | 53 | return $handler($command, $request); |
| 36 | 54 | }; |
| 37 | 55 | }; |
| @@ -42,13 +60,16 @@ | ||
| 42 | 60 | * @param Service $api API being accessed. |
| 43 | 61 | * |
| 44 | 62 | * @return callable |
| 45 | 63 | */ |
| 46 | - public static function validation(Service $api, Validator $validator = null) | |
| 64 | + public static function validation(Service $api, ?Validator $validator = null) | |
| 47 | 65 | { |
| 48 | 66 | $validator = $validator ?: new Validator(); |
| 49 | 67 | return function (callable $handler) use($api, $validator) { |
| 50 | - return function (CommandInterface $command, RequestInterface $request = null) use($api, $validator, $handler) { | |
| 68 | + return function (CommandInterface $command, ?RequestInterface $request = null) use($api, $validator, $handler) { | |
| 69 | + if ($api->isModifiedModel()) { | |
| 70 | + $api = new Service($api->getDefinition(), $api->getProvider()); | |
| 71 | + } | |
| 51 | 72 | $operation = $api->getOperation($command->getName()); |
| 52 | 73 | $validator->validate($command->getName(), $operation->getInput(), $command->toArray()); |
| 53 | 74 | return $handler($command, $request); |
| 54 | 75 | }; |
| @@ -58,15 +79,17 @@ | ||
| 58 | 79 | * Builds an HTTP request for a command. |
| 59 | 80 | * |
| 60 | 81 | * @param callable $serializer Function used to serialize a request for a |
| 61 | 82 | * command. |
| 83 | + * @param EndpointProviderV2 | null $endpointProvider | |
| 84 | + * @param array $providerArgs | |
| 62 | 85 | * @return callable |
| 63 | 86 | */ |
| 64 | - public static function requestBuilder(callable $serializer) | |
| 87 | + public static function requestBuilder($serializer) | |
| 65 | 88 | { |
| 66 | 89 | return function (callable $handler) use($serializer) { |
| 67 | - return function (CommandInterface $command) use($serializer, $handler) { | |
| 68 | - return $handler($command, $serializer($command)); | |
| 90 | + return function (CommandInterface $command, $endpoint = null) use($serializer, $handler) { | |
| 91 | + return $handler($command, $serializer($command, $endpoint)); | |
| 69 | 92 | }; |
| 70 | 93 | }; |
| 71 | 94 | } |
| 72 | 95 | /** |
| @@ -80,14 +103,27 @@ | ||
| 80 | 103 | * SignatureInterface. |
| 81 | 104 | * |
| 82 | 105 | * @return callable |
| 83 | 106 | */ |
| 84 | - public static function signer(callable $credProvider, callable $signatureFunction) | |
| 107 | + public static function signer(callable $credProvider, callable $signatureFunction, $tokenProvider = null, $config = []) | |
| 85 | 108 | { |
| 86 | - return function (callable $handler) use($signatureFunction, $credProvider) { | |
| 87 | - return function (CommandInterface $command, RequestInterface $request) use($handler, $signatureFunction, $credProvider) { | |
| 109 | + return function (callable $handler) use($signatureFunction, $credProvider, $tokenProvider, $config) { | |
| 110 | + return function (CommandInterface $command, RequestInterface $request) use($handler, $signatureFunction, $credProvider, $tokenProvider, $config) { | |
| 88 | 111 | $signer = $signatureFunction($command); |
| 89 | - return $credProvider()->then(function (CredentialsInterface $creds) use($handler, $command, $signer, $request) { | |
| 112 | + if ($signer instanceof TokenAuthorization) { | |
| 113 | + return $tokenProvider()->then(function (TokenInterface $token) use($handler, $command, $signer, $request) { | |
| 114 | + $command->getMetricsBuilder()->identifyMetricByValueAndAppend('token', $token); | |
| 115 | + return $handler($command, $signer->authorizeRequest($request, $token)); | |
| 116 | + }); | |
| 117 | + } | |
| 118 | + if ($signer instanceof S3ExpressSignature) { | |
| 119 | + $credentialPromise = $config['s3_express_identity_provider']($command); | |
| 120 | + } else { | |
| 121 | + $credentialPromise = $credProvider(); | |
| 122 | + } | |
| 123 | + return $credentialPromise->then(function (CredentialsInterface $creds) use($handler, $command, $signer, $request) { | |
| 124 | + // Capture credentials metric | |
| 125 | + $command->getMetricsBuilder()->identifyMetricByValueAndAppend('credentials', $creds); | |
| 90 | 126 | return $handler($command, $signer->signRequest($request, $creds)); |
| 91 | 127 | }); |
| 92 | 128 | }; |
| 93 | 129 | }; |
| @@ -106,9 +142,9 @@ | ||
| 106 | 142 | */ |
| 107 | 143 | public static function tap(callable $fn) |
| 108 | 144 | { |
| 109 | 145 | return function (callable $handler) use($fn) { |
| 110 | - return function (CommandInterface $command, RequestInterface $request = null) use($handler, $fn) { | |
| 146 | + return function (CommandInterface $command, ?RequestInterface $request = null) use($handler, $fn) { | |
| 111 | 147 | $fn($command, $request); |
| 112 | 148 | return $handler($command, $request); |
| 113 | 149 | }; |
| 114 | 150 | }; |
| @@ -129,9 +165,9 @@ | ||
| 129 | 165 | * associated delay. |
| 130 | 166 | * |
| 131 | 167 | * @return callable |
| 132 | 168 | */ |
| 133 | - public static function retry(callable $decider = null, callable $delay = null, $stats = \false) | |
| 169 | + public static function retry(?callable $decider = null, ?callable $delay = null, $stats = \false) | |
| 134 | 170 | { |
| 135 | 171 | $decider = $decider ?: RetryMiddleware::createDefaultDecider(); |
| 136 | 172 | $delay = $delay ?: [RetryMiddleware::class, 'exponentialDelay']; |
| 137 | 173 | return function (callable $handler) use($decider, $delay, $stats) { |
| @@ -167,9 +203,9 @@ | ||
| 167 | 203 | */ |
| 168 | 204 | public static function contentType(array $operations) |
| 169 | 205 | { |
| 170 | 206 | return function (callable $handler) use($operations) { |
| 171 | - return function (CommandInterface $command, RequestInterface $request = null) use($handler, $operations) { | |
| 207 | + return function (CommandInterface $command, ?RequestInterface $request = null) use($handler, $operations) { | |
| 172 | 208 | if (!$request->hasHeader('Content-Type') && \in_array($command->getName(), $operations, \true) && ($uri = $request->getBody()->getMetadata('uri'))) { |
| 173 | 209 | $request = $request->withHeader('Content-Type', Psr7\MimeType::fromFilename($uri) ?: 'application/octet-stream'); |
| 174 | 210 | } |
| 175 | 211 | return $handler($command, $request); |
| @@ -217,9 +253,9 @@ | ||
| 217 | 253 | */ |
| 218 | 254 | public static function history(History $history) |
| 219 | 255 | { |
| 220 | 256 | return function (callable $handler) use($history) { |
| 221 | - return function (CommandInterface $command, RequestInterface $request = null) use($handler, $history) { | |
| 257 | + return function (CommandInterface $command, ?RequestInterface $request = null) use($handler, $history) { | |
| 222 | 258 | $ticket = $history->start($command, $request); |
| 223 | 259 | return $handler($command, $request)->then(function ($result) use($history, $ticket) { |
| 224 | 260 | $history->finish($ticket, $result); |
| 225 | 261 | return $result; |
| @@ -241,9 +277,9 @@ | ||
| 241 | 277 | */ |
| 242 | 278 | public static function mapRequest(callable $f) |
| 243 | 279 | { |
| 244 | 280 | return function (callable $handler) use($f) { |
| 245 | - return function (CommandInterface $command, RequestInterface $request = null) use($handler, $f) { | |
| 281 | + return function (CommandInterface $command, ?RequestInterface $request = null) use($handler, $f) { | |
| 246 | 282 | return $handler($command, $f($request)); |
| 247 | 283 | }; |
| 248 | 284 | }; |
| 249 | 285 | } |
| @@ -258,9 +294,9 @@ | ||
| 258 | 294 | */ |
| 259 | 295 | public static function mapCommand(callable $f) |
| 260 | 296 | { |
| 261 | 297 | return function (callable $handler) use($f) { |
| 262 | - return function (CommandInterface $command, RequestInterface $request = null) use($handler, $f) { | |
| 298 | + return function (CommandInterface $command, ?RequestInterface $request = null) use($handler, $f) { | |
| 263 | 299 | return $handler($f($command), $request); |
| 264 | 300 | }; |
| 265 | 301 | }; |
| 266 | 302 | } |
| @@ -274,9 +310,9 @@ | ||
| 274 | 310 | */ |
| 275 | 311 | public static function mapResult(callable $f) |
| 276 | 312 | { |
| 277 | 313 | return function (callable $handler) use($f) { |
| 278 | - return function (CommandInterface $command, RequestInterface $request = null) use($handler, $f) { | |
| 314 | + return function (CommandInterface $command, ?RequestInterface $request = null) use($handler, $f) { | |
| 279 | 315 | return $handler($command, $request)->then($f); |
| 280 | 316 | }; |
| 281 | 317 | }; |
| 282 | 318 | } |
| @@ -282,9 +318,9 @@ | ||
| 282 | 318 | } |
| 283 | 319 | public static function timer() |
| 284 | 320 | { |
| 285 | 321 | return function (callable $handler) { |
| 286 | - return function (CommandInterface $command, RequestInterface $request = null) use($handler) { | |
| 322 | + return function (CommandInterface $command, ?RequestInterface $request = null) use($handler) { | |
| 287 | 323 | $start = \microtime(\true); |
| 288 | 324 | return $handler($command, $request)->then(function (ResultInterface $res) use($start) { |
| 289 | 325 | if (!isset($res['@metadata'])) { |
| 290 | 326 | $res['@metadata'] = []; |