S3 - fix encoding for prefix (#5239)

This commit is contained in:
Cristopher Pinzón 2022-06-17 05:21:06 -05:00 committed by GitHub
parent 19bb5f96d2
commit a44a9df21d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 0 deletions

View File

@ -3,6 +3,8 @@ import os
import re
from typing import List, Union
import urllib.parse
from moto import settings
from moto.core.utils import (
amzn_request_id,
@ -633,6 +635,12 @@ class S3Response(BaseResponse):
key_count = len(result_keys) + len(result_folders)
if encoding_type == "url":
prefix = urllib.parse.quote(prefix) if prefix else ""
result_folders = list(
map(lambda folder: urllib.parse.quote(folder), result_folders)
)
return template.render(
bucket=bucket,
prefix=prefix or "",

View File

@ -3364,3 +3364,26 @@ def test_head_versioned_key_in_not_versioned_bucket():
response = ex.value.response
assert response["Error"]["Code"] == "400"
@mock_s3
def test_prefix_encoding():
bucket_name = "encoding-bucket"
client = boto3.client("s3", region_name=DEFAULT_REGION_NAME)
client.create_bucket(Bucket=bucket_name)
client.put_object(Bucket=bucket_name, Key="foo%2Fbar/data", Body=b"")
data = client.list_objects_v2(Bucket=bucket_name, Prefix="foo%2Fbar")
assert data["Contents"][0]["Key"].startswith(data["Prefix"])
data = client.list_objects_v2(Bucket=bucket_name, Prefix="foo%2Fbar", Delimiter="/")
assert data["CommonPrefixes"] == [{"Prefix": "foo%2Fbar/"}]
client.put_object(Bucket=bucket_name, Key="foo/bar/data", Body=b"")
data = client.list_objects_v2(Bucket=bucket_name, Delimiter="/")
folders = list(
map(lambda common_prefix: common_prefix["Prefix"], data["CommonPrefixes"])
)
assert ["foo%2Fbar/", "foo/"] == folders