From df8bd43a456e7229cb87bbf911a0432033368f97 Mon Sep 17 00:00:00 2001 From: Bert Blommers Date: Wed, 13 Jan 2021 10:00:18 +0000 Subject: [PATCH] #2965 - S3 - GetObject - Treat empty Range-argument as a regular GET (#3531) --- moto/s3/responses.py | 6 +++++- tests/test_s3/test_s3.py | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/moto/s3/responses.py b/moto/s3/responses.py index c2d41b04b..8b1dbe9b5 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -975,7 +975,11 @@ class ResponseObject(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): else: status_code, response_headers, response_content = response - if status_code == 200 and "range" in request.headers: + if ( + status_code == 200 + and "range" in request.headers + and request.headers["range"] != "" + ): try: return self._handle_range_header( request, response_headers, response_content diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index aa857d089..0f5624f96 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -4937,3 +4937,16 @@ def test_request_partial_content_should_contain_actual_content_length(): ) e.response["Error"]["ActualObjectSize"].should.equal("9") e.response["Error"]["RangeRequested"].should.equal(requested_range) + + +@mock_s3 +def test_request_partial_content_without_specifying_range_should_return_full_object(): + bucket = "bucket" + object_key = "key" + s3 = boto3.resource("s3", region_name="us-east-1") + s3.create_bucket(Bucket=bucket) + s3.Object(bucket, object_key).put(Body="some text that goes a long way") + + file = s3.Object(bucket, object_key) + response = file.get(Range="") + response["ContentLength"].should.equal(30)