From 7a57dc203422396a4b8ae23cd5bb0955222163a9 Mon Sep 17 00:00:00 2001 From: Alexander Mohr Date: Thu, 3 May 2018 01:40:49 -0700 Subject: [PATCH] fix errors --- moto/s3/models.py | 3 +++ moto/s3/responses.py | 8 +++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/moto/s3/models.py b/moto/s3/models.py index 3b4623d6..9e58fdb4 100644 --- a/moto/s3/models.py +++ b/moto/s3/models.py @@ -859,6 +859,9 @@ class S3Backend(BaseBackend): if str(key.version_id) != str(version_id) ] ) + + if not bucket.keys.getlist(key_name): + bucket.keys.pop(key_name) return True except KeyError: return False diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 02a9ac40..f8b3077d 100755 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -24,7 +24,6 @@ from xml.dom import minidom DEFAULT_REGION_NAME = 'us-east-1' - def parse_key_name(pth): return pth.lstrip("/") @@ -706,8 +705,11 @@ class ResponseObject(_TemplateEnvironmentMixin): if 'x-amz-copy-source' in request.headers: # Copy key - src_key_parsed = urlparse(unquote(request.headers.get("x-amz-copy-source"))) - src_bucket, src_key = src_key_parsed.path.lstrip("/").split("/", 1) + # you can have a quoted ?version=abc with a version Id, so work on + # we need to parse the unquoted string first + src_key_parsed = urlparse(request.headers.get("x-amz-copy-source")) + src_bucket, src_key = unquote(src_key_parsed.path).\ + lstrip("/").split("/", 1) src_version_id = parse_qs(src_key_parsed.query).get( 'versionId', [None])[0] self.backend.copy_key(src_bucket, src_key, bucket_name, key_name,