diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 6ba401b90..420b10ce7 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -237,7 +237,10 @@ class ResponseObject(_TemplateEnvironmentMixin): begin = 0 end = None if 'range' in request.headers: - begin, end = map(int, request.headers.get('range').split('-')) + _, rspec = request.headers.get('range').split('=') + if ',' in rspec: + raise NotImplementedError("Multiple range specifiers not supported") + begin, end = map(lambda i: int(i) if i else None, rspec.split('-')) if isinstance(response, six.string_types): return 200, headers, response[begin:end] diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index ecfeb23c7..1b4077226 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -701,4 +701,6 @@ def test_ranged_get(): 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) + key.get_contents_as_string(headers={'Range': 'bytes=45-55'}).should.equal(b'0' * 5 + b'1' * 5) + key.get_contents_as_string(headers={'Range': 'bytes=45-'}).should.equal(b'0' * 5 + b'1' * 50) + key.get_contents_as_string(headers={'Range': 'bytes=-55'}).should.equal(b'0' * 50 + b'1' * 5)