return proper status codes in range get, fix suffix range
This commit is contained in:
parent
9efd12c43c
commit
418a6a118e
@ -228,25 +228,40 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
|
|
||||||
return 200, headers, template.render(deleted=deleted_names, delete_errors=error_names)
|
return 200, headers, template.render(deleted=deleted_names, delete_errors=error_names)
|
||||||
|
|
||||||
|
def _handle_range_header(self, request, headers, response_content):
|
||||||
|
length = len(response_content)
|
||||||
|
_, rspec = request.headers.get('range').split('=')
|
||||||
|
if ',' in rspec:
|
||||||
|
raise NotImplementedError(
|
||||||
|
"Multiple range specifiers not supported")
|
||||||
|
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
|
||||||
|
elif end is not None: # suffix byte range
|
||||||
|
begin = length - end
|
||||||
|
end = length
|
||||||
|
else:
|
||||||
|
return 400, headers, ""
|
||||||
|
if begin < 0 or end > length or begin > min(end, length):
|
||||||
|
return 416, headers, ""
|
||||||
|
return 206, headers, response_content[begin:end]
|
||||||
|
|
||||||
def key_response(self, request, full_url, headers):
|
def key_response(self, request, full_url, headers):
|
||||||
try:
|
try:
|
||||||
response = self._key_response(request, full_url, headers)
|
response = self._key_response(request, full_url, headers)
|
||||||
except MissingBucket:
|
except MissingBucket:
|
||||||
return 404, headers, ""
|
return 404, headers, ""
|
||||||
|
|
||||||
begin = 0
|
|
||||||
end = None
|
|
||||||
if 'range' in request.headers:
|
|
||||||
_, 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):
|
if isinstance(response, six.string_types):
|
||||||
return 200, headers, response[begin:end]
|
status_code = 200
|
||||||
|
response_content = response
|
||||||
else:
|
else:
|
||||||
status_code, headers, response_content = response
|
status_code, headers, response_content = response
|
||||||
return status_code, headers, response_content[begin:end]
|
|
||||||
|
if status_code == 200 and 'range' in request.headers:
|
||||||
|
return self._handle_range_header(request, headers, response_content)
|
||||||
|
return status_code, headers, response_content
|
||||||
|
|
||||||
def _key_response(self, request, full_url, headers):
|
def _key_response(self, request, full_url, headers):
|
||||||
parsed_url = urlparse(full_url)
|
parsed_url = urlparse(full_url)
|
||||||
|
@ -703,4 +703,4 @@ def test_ranged_get():
|
|||||||
key.set_contents_from_string('0' * 50 + '1' * 50)
|
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-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=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)
|
key.get_contents_as_string(headers={'Range': 'bytes=-55'}).should.equal(b'0' * 5 + b'1' * 50)
|
||||||
|
Loading…
Reference in New Issue
Block a user