diff options
author | Andrew Dolgov <[email protected]> | 2023-10-20 16:44:35 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2023-10-20 16:44:35 +0300 |
commit | 8bec661288b276c98bdb0e773e5f4d5275dc4c87 (patch) | |
tree | 8617ebe581c62fc46a7881aa61801ebce9d3c603 /vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php | |
parent | 540438c2eb5452bacad30c247906bfa287f2da1d (diff) |
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php index 19cb969..1a915ca 100644 --- a/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php +++ b/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php @@ -46,12 +46,23 @@ class BucketEndpointMiddleware return $nextHandler($command, $request); } - private function removeBucketFromPath($path, $bucket) + /** + * Performs a one-time removal of Bucket from path, then if + * the bucket name is duplicated in the path, performs additional + * removal which is dependent on the number of occurrences of the bucket + * name in a path-like format in the key name. + * + * @return string + */ + private function removeBucketFromPath($path, $bucket, $key) { - $len = strlen($bucket) + 1; - if (substr($path, 0, $len) === "/{$bucket}") { - $path = substr($path, $len); - } + $occurrencesInKey = $this->getBucketNameOccurrencesInKey($key, $bucket); + do { + $len = strlen($bucket) + 1; + if (substr($path, 0, $len) === "/{$bucket}") { + $path = substr($path, $len); + } + } while (substr_count($path, "/{$bucket}") > $occurrencesInKey + 1); return $path ?: '/'; } @@ -68,25 +79,42 @@ class BucketEndpointMiddleware return $host; } + private function getBucketNameOccurrencesInKey($key, $bucket) + { + $occurrences = 0; + if (empty($key)) { + return $occurrences; + } + + $segments = explode('/', $key); + foreach($segments as $segment) { + if (strpos($segment, $bucket) === 0) { + $occurrences++; + } + } + return $occurrences; + } + private function modifyRequest( RequestInterface $request, CommandInterface $command ) { + $key = isset($command['Key']) ? $command['Key'] : null; $uri = $request->getUri(); $path = $uri->getPath(); $host = $uri->getHost(); $bucket = $command['Bucket']; - $path = $this->removeBucketFromPath($path, $bucket); + $path = $this->removeBucketFromPath($path, $bucket, $key); $host = $this->removeDuplicateBucketFromHost($host, $bucket); // Modify the Key to make sure the key is encoded, but slashes are not. - if ($command['Key']) { + if ($key) { $path = S3Client::encodeKey(rawurldecode($path)); } return $request->withUri( $uri->withHost($host) - ->withPath($path) + ->withPath($path) ); } } |