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/S3/BucketEndpointMiddleware.php |
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php new file mode 100644 index 0000000..19cb969 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php @@ -0,0 +1,92 @@ +<?php +namespace Aws\S3; + +use Aws\CommandInterface; +use Psr\Http\Message\RequestInterface; + +/** + * Used to update the host used for S3 requests in the case of using a + * "bucket endpoint" or CNAME bucket. + * + * IMPORTANT: this middleware must be added after the "build" step. + * + * @internal + */ +class BucketEndpointMiddleware +{ + private static $exclusions = ['GetBucketLocation' => true]; + private $nextHandler; + + /** + * Create a middleware wrapper function. + * + * @return callable + */ + public static function wrap() + { + return function (callable $handler) { + return new self($handler); + }; + } + + public function __construct(callable $nextHandler) + { + $this->nextHandler = $nextHandler; + } + + public function __invoke(CommandInterface $command, RequestInterface $request) + { + $nextHandler = $this->nextHandler; + $bucket = $command['Bucket']; + + if ($bucket && !isset(self::$exclusions[$command->getName()])) { + $request = $this->modifyRequest($request, $command); + } + + return $nextHandler($command, $request); + } + + private function removeBucketFromPath($path, $bucket) + { + $len = strlen($bucket) + 1; + if (substr($path, 0, $len) === "/{$bucket}") { + $path = substr($path, $len); + } + + return $path ?: '/'; + } + + private function removeDuplicateBucketFromHost($host, $bucket) + { + if (substr_count($host, $bucket) > 1) { + while (strpos($host, "{$bucket}.{$bucket}") === 0) { + $hostArr = explode('.', $host); + array_shift($hostArr); + $host = implode('.', $hostArr); + } + } + return $host; + } + + private function modifyRequest( + RequestInterface $request, + CommandInterface $command + ) { + $uri = $request->getUri(); + $path = $uri->getPath(); + $host = $uri->getHost(); + $bucket = $command['Bucket']; + $path = $this->removeBucketFromPath($path, $bucket); + $host = $this->removeDuplicateBucketFromHost($host, $bucket); + + // Modify the Key to make sure the key is encoded, but slashes are not. + if ($command['Key']) { + $path = S3Client::encodeKey(rawurldecode($path)); + } + + return $request->withUri( + $uri->withHost($host) + ->withPath($path) + ); + } +} |