From e1163e5223a57afadb7ff04222da735455cef2b2 Mon Sep 17 00:00:00 2001 From: Konstantinos Koukopoulos Date: Tue, 10 Feb 2015 19:43:24 +0200 Subject: [PATCH] fix some boundary conditions --- moto/s3/responses.py | 9 +++++---- tests/test_s3/test_s3.py | 13 +++++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/moto/s3/responses.py b/moto/s3/responses.py index a0750e5ac..5cd6fb9b0 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -230,6 +230,7 @@ class ResponseObject(_TemplateEnvironmentMixin): def _handle_range_header(self, request, headers, response_content): length = len(response_content) + last = length - 1 _, rspec = request.headers.get('range').split('=') if ',' in rspec: raise NotImplementedError( @@ -237,17 +238,17 @@ class ResponseObject(_TemplateEnvironmentMixin): toint = lambda i: int(i) if i else None begin, end = map(toint, rspec.split('-')) if begin is not None: # byte range - end = end or length + end = last if end is None else end elif end is not None: # suffix byte range begin = length - end - end = length + end = last else: return 400, headers, "" - if begin < 0 or end > length or begin > min(end, length): + if begin < 0 or end > length or begin > min(end, last): return 416, headers, "" headers['content-range'] = "bytes {0}-{1}/{2}".format( begin, end, length) - return 206, headers, response_content[begin:end] + return 206, headers, response_content[begin:end + 1] def key_response(self, request, full_url, headers): try: diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 3b30ef2e7..e1a5a0355 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -700,8 +700,13 @@ def test_ranged_get(): 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': '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' * 5 + b'1' * 50) + rep = "0123456789" + key.set_contents_from_string(rep * 10) + key.get_contents_as_string(headers={'Range': 'bytes=0-'}).should.equal(rep * 10) + key.get_contents_as_string(headers={'Range': 'bytes=0-99'}).should.equal(rep * 10) + key.get_contents_as_string(headers={'Range': 'bytes=0-0'}).should.equal(b'0') + key.get_contents_as_string(headers={'Range': 'bytes=99-99'}).should.equal(b'9') + key.get_contents_as_string(headers={'Range': 'bytes=50-54'}).should.equal(rep[:5]) + key.get_contents_as_string(headers={'Range': 'bytes=50-'}).should.equal(rep * 5) + key.get_contents_as_string(headers={'Range': 'bytes=-60'}).should.equal(rep * 6) key.size.should.equal(100)