S3: Simplify detection of delete-flag (#5613)

This commit is contained in:
Bert Blommers 2022-10-29 15:02:46 +00:00 committed by GitHub
parent b17a792f1c
commit 60c6fbd46b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 4 additions and 30 deletions

View File

@ -20,7 +20,6 @@ from moto.core.utils import path_url
from moto.s3bucket_path.utils import (
bucket_name_from_url as bucketpath_bucket_name_from_url,
parse_key_name as bucketpath_parse_key_name,
is_delete_keys as bucketpath_is_delete_keys,
)
from moto.utilities.aws_headers import amzn_request_id
@ -142,17 +141,6 @@ def parse_key_name(pth):
return pth[1:] if pth.startswith("/") else pth
def is_delete_keys(request, path):
# GOlang sends a request as url/?delete= (treating it as a normal key=value, even if the value is empty)
# Python sends a request as url/?delete (treating it as a flag)
# https://github.com/spulec/moto/issues/2937
return (
path == "/?delete"
or path == "/?delete="
or (path == "/" and getattr(request, "query_string", "") == "delete")
)
class S3Response(BaseResponse):
def __init__(self):
super().__init__(service_name="s3")
@ -226,11 +214,9 @@ class S3Response(BaseResponse):
)
return not path_based
def is_delete_keys(self, request, path, bucket_name):
if self.subdomain_based_buckets(request):
return is_delete_keys(request, path)
else:
return bucketpath_is_delete_keys(request, path, bucket_name)
def is_delete_keys(self):
qs = parse_qs(urlparse(self.path).query, keep_blank_values=True)
return "delete" in qs
def parse_bucket_name_from_url(self, request, url):
if self.subdomain_based_buckets(request):
@ -964,7 +950,7 @@ class S3Response(BaseResponse):
self.path = self._get_path(request)
if self.is_delete_keys(request, self.path, bucket_name):
if self.is_delete_keys():
self.data["Action"] = "DeleteObject"
try:
self._authenticate_and_authorize_s3_action()

View File

@ -12,15 +12,3 @@ def bucket_name_from_url(url):
def parse_key_name(path):
return "/".join(path.split("/")[2:])
def is_delete_keys(request, path, bucket_name):
return (
path == "/" + bucket_name + "/?delete"
or path == "/" + bucket_name + "?delete"
or path == "/" + bucket_name + "?delete="
or (
path == "/" + bucket_name
and getattr(request, "query_string", "") == "delete"
)
)