From 49b00942c3b8cc6b71a600db41c014396422c0e6 Mon Sep 17 00:00:00 2001 From: Bert Blommers Date: Fri, 1 May 2020 13:50:11 +0100 Subject: [PATCH] S3 DeleteObjects - Allow multiple querystring formats --- moto/s3/responses.py | 9 +++++++-- tests/test_s3/test_s3.py | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/moto/s3/responses.py b/moto/s3/responses.py index e1ab93860..98f28f012 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -137,8 +137,13 @@ def parse_key_name(pth): def is_delete_keys(request, path, bucket_name): - return path == "/?delete" or ( - path == "/" and getattr(request, "query_string", "") == "delete" + # 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") ) diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 86b892315..f60e0293e 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -3765,7 +3765,7 @@ def test_paths_with_leading_slashes_work(): @mock_s3 def test_root_dir_with_empty_name_works(): - if os.environ.get("TEST_SERVER_MODE", "false").lower() == "true": + if settings.TEST_SERVER_MODE: raise SkipTest("Does not work in server mode due to error in Workzeug") store_and_read_back_a_key("/")