summaryrefslogtreecommitdiff
path: root/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php')
-rw-r--r--vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php44
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)
);
}
}