Allow S3 keys to start with leading slashes.

This commit is contained in:
Olivier Parent Colombel 2020-04-20 20:54:31 +02:00
parent eb17288503
commit 637e0188a2
3 changed files with 25 additions and 2 deletions

View File

@ -134,7 +134,8 @@ ACTION_MAP = {
def parse_key_name(pth):
return pth.lstrip("/")
# strip the first '/' left by urlparse
return pth[1:] if pth.startswith('/') else pth
def is_delete_keys(request, path, bucket_name):

View File

@ -15,5 +15,5 @@ url_paths = {
# path-based bucket + key
"{0}/(?P<bucket_name_path>[^/]+)/(?P<key_name>.+)": S3ResponseInstance.key_or_control_response,
# subdomain bucket + key with empty first part of path
"{0}//(?P<key_name>.*)$": S3ResponseInstance.key_or_control_response,
"{0}/(?P<key_name>/.*)$": S3ResponseInstance.key_or_control_response,
}

View File

@ -3744,6 +3744,28 @@ def test_root_dir_with_empty_name_works():
store_and_read_back_a_key("/")
@parameterized(['mybucket', 'my.bucket'])
@mock_s3
def test_leading_slashes_not_removed(bucket_name):
"""Make sure that leading slashes are not removed internally."""
s3 = boto3.client("s3", region_name=DEFAULT_REGION_NAME)
s3.create_bucket(Bucket=bucket_name)
uploaded_key = '/key'
invalid_key_1 = 'key'
invalid_key_2 = '//key'
s3.put_object(Bucket=bucket_name, Key=uploaded_key, Body=b'Some body')
with assert_raises(ClientError) as e:
s3.get_object(Bucket=bucket_name, Key=invalid_key_1)
e.exception.response["Error"]["Code"].should.equal("NoSuchKey")
with assert_raises(ClientError) as e:
s3.get_object(Bucket=bucket_name, Key=invalid_key_2)
e.exception.response["Error"]["Code"].should.equal("NoSuchKey")
@parameterized(
[("foo/bar/baz",), ("foo",), ("foo/run_dt%3D2019-01-01%252012%253A30%253A00",)]
)