diff options
author | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
commit | 0c8af4992cb0f7589dcafaad65ada12753c64594 (patch) | |
tree | 18e83d068c3e7dd2499331de977782b382279396 /vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php |
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php b/vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php new file mode 100644 index 0000000..da861b0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php @@ -0,0 +1,128 @@ +<?php +namespace Aws; + +use Aws\Signature\SignatureV4; +use Aws\Endpoint\EndpointProvider; +use GuzzleHttp\Psr7\Uri; +use Psr\Http\Message\RequestInterface; + +/** + * @internal Adds computed values to service operations that need presigned url. + */ +class PresignUrlMiddleware +{ + private $client; + private $endpointProvider; + private $nextHandler; + /** @var array names of operations that require presign url */ + private $commandPool; + /** @var array query params that are not on the operation's model to add before signing */ + private $extraQueryParams; + /** @var string */ + private $serviceName; + /** @var string */ + private $presignParam; + /** @var bool */ + private $requireDifferentRegion; + + public function __construct( + array $options, + $endpointProvider, + AwsClientInterface $client, + callable $nextHandler + ) { + $this->endpointProvider = $endpointProvider; + $this->client = $client; + $this->nextHandler = $nextHandler; + $this->commandPool = $options['operations']; + $this->serviceName = $options['service']; + $this->presignParam = !empty($options['presign_param']) + ? $options['presign_param'] + : 'PresignedUrl'; + $this->extraQueryParams = !empty($options['extra_query_params']) + ? $options['extra_query_params'] + : []; + $this->requireDifferentRegion = !empty($options['require_different_region']); + } + + public static function wrap( + AwsClientInterface $client, + $endpointProvider, + array $options = [] + ) { + return function (callable $handler) use ($endpointProvider, $client, $options) { + $f = new PresignUrlMiddleware($options, $endpointProvider, $client, $handler); + return $f; + }; + } + + public function __invoke(CommandInterface $cmd, RequestInterface $request = null) + { + if (in_array($cmd->getName(), $this->commandPool) + && (!isset($cmd->{'__skip' . $cmd->getName()})) + ) { + $cmd['DestinationRegion'] = $this->client->getRegion(); + if (!empty($cmd['SourceRegion']) && !empty($cmd[$this->presignParam])) { + goto nexthandler; + } + if (!$this->requireDifferentRegion + || (!empty($cmd['SourceRegion']) + && $cmd['SourceRegion'] !== $cmd['DestinationRegion']) + ) { + $cmd[$this->presignParam] = $this->createPresignedUrl($this->client, $cmd); + } + } + nexthandler: + $nextHandler = $this->nextHandler; + return $nextHandler($cmd, $request); + } + + private function createPresignedUrl( + AwsClientInterface $client, + CommandInterface $cmd + ) { + $cmdName = $cmd->getName(); + $newCmd = $client->getCommand($cmdName, $cmd->toArray()); + // Avoid infinite recursion by flagging the new command. + $newCmd->{'__skip' . $cmdName} = true; + + // Serialize a request for the operation. + $request = \Aws\serialize($newCmd); + // Create the new endpoint for the target endpoint. + if ($this->endpointProvider instanceof \Aws\EndpointV2\EndpointProviderV2) { + $providerArgs = array_merge( + $this->client->getEndpointProviderArgs(), + ['Region' => $cmd['SourceRegion']] + ); + $endpoint = $this->endpointProvider->resolveEndpoint($providerArgs)->getUrl(); + } else { + $endpoint = EndpointProvider::resolve($this->endpointProvider, [ + 'region' => $cmd['SourceRegion'], + 'service' => $this->serviceName, + ])['endpoint']; + } + + // Set the request to hit the target endpoint. + $uri = $request->getUri()->withHost((new Uri($endpoint))->getHost()); + $request = $request->withUri($uri); + + // Create a presigned URL for our generated request. + $signer = new SignatureV4($this->serviceName, $cmd['SourceRegion']); + + $currentQueryParams = (string) $request->getBody(); + $paramsToAdd = false; + if (!empty($this->extraQueryParams[$cmdName])) { + foreach ($this->extraQueryParams[$cmdName] as $param) { + if (!strpos($currentQueryParams, $param)) { + $paramsToAdd = "&{$param}={$cmd[$param]}"; + } + } + } + + return (string) $signer->presign( + SignatureV4::convertPostToGet($request, $paramsToAdd ?: ""), + $client->getCredentials()->wait(), + '+1 hour' + )->getUri(); + } +} |