S3: Simplify detection of delete-flag (#5613)
This commit is contained in:
parent
b17a792f1c
commit
60c6fbd46b
@ -20,7 +20,6 @@ from moto.core.utils import path_url
|
|||||||
from moto.s3bucket_path.utils import (
|
from moto.s3bucket_path.utils import (
|
||||||
bucket_name_from_url as bucketpath_bucket_name_from_url,
|
bucket_name_from_url as bucketpath_bucket_name_from_url,
|
||||||
parse_key_name as bucketpath_parse_key_name,
|
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
|
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
|
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):
|
class S3Response(BaseResponse):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__(service_name="s3")
|
super().__init__(service_name="s3")
|
||||||
@ -226,11 +214,9 @@ class S3Response(BaseResponse):
|
|||||||
)
|
)
|
||||||
return not path_based
|
return not path_based
|
||||||
|
|
||||||
def is_delete_keys(self, request, path, bucket_name):
|
def is_delete_keys(self):
|
||||||
if self.subdomain_based_buckets(request):
|
qs = parse_qs(urlparse(self.path).query, keep_blank_values=True)
|
||||||
return is_delete_keys(request, path)
|
return "delete" in qs
|
||||||
else:
|
|
||||||
return bucketpath_is_delete_keys(request, path, bucket_name)
|
|
||||||
|
|
||||||
def parse_bucket_name_from_url(self, request, url):
|
def parse_bucket_name_from_url(self, request, url):
|
||||||
if self.subdomain_based_buckets(request):
|
if self.subdomain_based_buckets(request):
|
||||||
@ -964,7 +950,7 @@ class S3Response(BaseResponse):
|
|||||||
|
|
||||||
self.path = self._get_path(request)
|
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"
|
self.data["Action"] = "DeleteObject"
|
||||||
try:
|
try:
|
||||||
self._authenticate_and_authorize_s3_action()
|
self._authenticate_and_authorize_s3_action()
|
||||||
|
@ -12,15 +12,3 @@ def bucket_name_from_url(url):
|
|||||||
|
|
||||||
def parse_key_name(path):
|
def parse_key_name(path):
|
||||||
return "/".join(path.split("/")[2:])
|
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"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user