Merge pull request #2430 from jessevogt/handle-url-encoded-keys

Fix for #2431 delete objects fails with url encoded key
This commit is contained in:
Steve Pulec 2019-09-25 20:55:42 -05:00 committed by GitHub
commit 23c1696b72
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 5 deletions

View file

@ -20,7 +20,7 @@ from .exceptions import BucketAlreadyExists, S3ClientError, MissingBucket, Missi
MalformedACLError, InvalidNotificationARN, InvalidNotificationEvent, ObjectNotInActiveTierError
from .models import s3_backend, get_canned_acl, FakeGrantee, FakeGrant, FakeAcl, FakeKey, FakeTagging, FakeTagSet, \
FakeTag
from .utils import bucket_name_from_url, clean_key_name, metadata_from_headers, parse_region_from_url
from .utils import bucket_name_from_url, clean_key_name, undo_clean_key_name, metadata_from_headers, parse_region_from_url
from xml.dom import minidom
@ -711,7 +711,7 @@ class ResponseObject(_TemplateEnvironmentMixin, ActionAuthenticatorMixin):
for k in keys:
key_name = k.firstChild.nodeValue
success = self.backend.delete_key(bucket_name, key_name)
success = self.backend.delete_key(bucket_name, undo_clean_key_name(key_name))
if success:
deleted_names.append(key_name)
else:

View file

@ -5,7 +5,7 @@ import os
from boto.s3.key import Key
import re
import six
from six.moves.urllib.parse import urlparse, unquote
from six.moves.urllib.parse import urlparse, unquote, quote
import sys
@ -71,10 +71,15 @@ def metadata_from_headers(headers):
def clean_key_name(key_name):
if six.PY2:
return unquote(key_name.encode('utf-8')).decode('utf-8')
return unquote(key_name)
def undo_clean_key_name(key_name):
if six.PY2:
return quote(key_name.encode('utf-8')).decode('utf-8')
return quote(key_name)
class _VersionedKeyStore(dict):
""" A simplified/modified version of Django's `MultiValueDict` taken from: