From dbf1e64d4406e70a3d96e9c54cafebe0f252bfcb Mon Sep 17 00:00:00 2001 From: Konstantinos Koukopoulos Date: Tue, 10 Feb 2015 17:28:18 +0200 Subject: [PATCH] support ranged get in S3 --- moto/s3/responses.py | 9 +++++++-- tests/test_s3/test_s3.py | 10 ++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 750bf68ba..6ba401b90 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -234,11 +234,16 @@ class ResponseObject(_TemplateEnvironmentMixin): except MissingBucket: return 404, headers, "" + begin = 0 + end = None + if 'range' in request.headers: + begin, end = map(int, request.headers.get('range').split('-')) + if isinstance(response, six.string_types): - return 200, headers, response + return 200, headers, response[begin:end] else: status_code, headers, response_content = response - return status_code, headers, response_content + return status_code, headers, response_content[begin:end] def _key_response(self, request, full_url, headers): parsed_url = urlparse(full_url) diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 1643eaaff..ecfeb23c7 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -692,3 +692,13 @@ def test_bucket_location(): conn = boto.s3.connect_to_region("us-west-2") bucket = conn.create_bucket('mybucket') bucket.get_location().should.equal("us-west-2") + + +@mock_s3 +def test_ranged_get(): + conn = boto.connect_s3() + bucket = conn.create_bucket('mybucket') + key = Key(bucket) + key.key = 'bigkey' + key.set_contents_from_string('0' * 50 + '1' * 50) + key.get_contents_as_string(headers={'Range': '45-55'}).should.equal('0' * 5 + '1' * 5)