S3 - fix encoding for prefix (#5239)
This commit is contained in:
parent
19bb5f96d2
commit
a44a9df21d
@ -3,6 +3,8 @@ import os
|
|||||||
import re
|
import re
|
||||||
from typing import List, Union
|
from typing import List, Union
|
||||||
|
|
||||||
|
import urllib.parse
|
||||||
|
|
||||||
from moto import settings
|
from moto import settings
|
||||||
from moto.core.utils import (
|
from moto.core.utils import (
|
||||||
amzn_request_id,
|
amzn_request_id,
|
||||||
@ -633,6 +635,12 @@ class S3Response(BaseResponse):
|
|||||||
|
|
||||||
key_count = len(result_keys) + len(result_folders)
|
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(
|
return template.render(
|
||||||
bucket=bucket,
|
bucket=bucket,
|
||||||
prefix=prefix or "",
|
prefix=prefix or "",
|
||||||
|
@ -3364,3 +3364,26 @@ def test_head_versioned_key_in_not_versioned_bucket():
|
|||||||
|
|
||||||
response = ex.value.response
|
response = ex.value.response
|
||||||
assert response["Error"]["Code"] == "400"
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user