fix some boundary conditions
This commit is contained in:
parent
261328d449
commit
e1163e5223
@ -230,6 +230,7 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
|
|
||||||
def _handle_range_header(self, request, headers, response_content):
|
def _handle_range_header(self, request, headers, response_content):
|
||||||
length = len(response_content)
|
length = len(response_content)
|
||||||
|
last = length - 1
|
||||||
_, rspec = request.headers.get('range').split('=')
|
_, rspec = request.headers.get('range').split('=')
|
||||||
if ',' in rspec:
|
if ',' in rspec:
|
||||||
raise NotImplementedError(
|
raise NotImplementedError(
|
||||||
@ -237,17 +238,17 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
toint = lambda i: int(i) if i else None
|
toint = lambda i: int(i) if i else None
|
||||||
begin, end = map(toint, rspec.split('-'))
|
begin, end = map(toint, rspec.split('-'))
|
||||||
if begin is not None: # byte range
|
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
|
elif end is not None: # suffix byte range
|
||||||
begin = length - end
|
begin = length - end
|
||||||
end = length
|
end = last
|
||||||
else:
|
else:
|
||||||
return 400, headers, ""
|
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, ""
|
return 416, headers, ""
|
||||||
headers['content-range'] = "bytes {0}-{1}/{2}".format(
|
headers['content-range'] = "bytes {0}-{1}/{2}".format(
|
||||||
begin, end, length)
|
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):
|
def key_response(self, request, full_url, headers):
|
||||||
try:
|
try:
|
||||||
|
@ -700,8 +700,13 @@ def test_ranged_get():
|
|||||||
bucket = conn.create_bucket('mybucket')
|
bucket = conn.create_bucket('mybucket')
|
||||||
key = Key(bucket)
|
key = Key(bucket)
|
||||||
key.key = 'bigkey'
|
key.key = 'bigkey'
|
||||||
key.set_contents_from_string('0' * 50 + '1' * 50)
|
rep = "0123456789"
|
||||||
key.get_contents_as_string(headers={'Range': 'bytes=45-55'}).should.equal(b'0' * 5 + b'1' * 5)
|
key.set_contents_from_string(rep * 10)
|
||||||
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=0-'}).should.equal(rep * 10)
|
||||||
key.get_contents_as_string(headers={'Range': 'bytes=-55'}).should.equal(b'0' * 5 + b'1' * 50)
|
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)
|
key.size.should.equal(100)
|
||||||
|
Loading…
Reference in New Issue
Block a user