Tidied the /range controller code

Extracted some of the range processing logic into a separate function
This commit is contained in:
David Shirley
2015-01-26 14:54:36 -08:00
parent 7e18da5ae9
commit 0484ea2c91
2 changed files with 24 additions and 21 deletions
+2 -16
View File
@@ -21,7 +21,7 @@ from werkzeug.wrappers import BaseResponse
from six.moves import range as xrange
from . import filters
from .helpers import get_headers, status_code, get_dict, parse_request_range, check_basic_auth, check_digest_auth, secure_cookie, H, ROBOT_TXT, ANGRY_ASCII
from .helpers import get_headers, status_code, get_dict, get_request_range, check_basic_auth, check_digest_auth, secure_cookie, H, ROBOT_TXT, ANGRY_ASCII
from .utils import weighted_choice
from .structures import CaseInsensitiveDict
@@ -564,21 +564,7 @@ def range_request(numbytes):
pause_per_byte = duration / numbytes
request_headers = get_headers()
request_range = parse_request_range(request_headers['range'], numbytes)
first_byte_pos = request_range[0]
last_byte_pos = request_range[1]
if first_byte_pos is None and last_byte_pos is None:
# Request full range
first_byte_pos = 0
last_byte_pos = numbytes - 1
elif first_byte_pos is None:
# Request the last X bytes
first_byte_pos = max(0, numbytes - last_byte_pos)
last_byte_pos = numbytes - 1
elif last_byte_pos is None:
# Request the last X bytes
last_byte_pos = numbytes - 1
first_byte_pos, last_byte_pos = get_request_range(request_headers, numbytes)
if first_byte_pos > last_byte_pos or first_byte_pos not in xrange(0, numbytes) or last_byte_pos not in xrange(0, numbytes):
response = Response(headers={
+22 -5
View File
@@ -334,7 +334,7 @@ def secure_cookie():
"""Return true if cookie should have secure attribute"""
return request.environ['wsgi.url_scheme'] == 'https'
def parse_request_range(range_header_text, upper_bound):
def __parse_request_range(range_header_text):
""" Return a tuple describing the byte range requested in a GET request
If the range is open ended on the left or right side, then a value of None
will be set.
@@ -349,15 +349,15 @@ def parse_request_range(range_header_text, upper_bound):
right = None
if not range_header_text:
return (left, right)
return left, right
range_header_text = range_header_text.strip()
if not range_header_text.startswith('bytes'):
return (left, right)
return left, right
components = range_header_text.split("=")
if len(components) != 2:
return (left, right)
return left, right
components = components[1].split("-")
@@ -371,5 +371,22 @@ def parse_request_range(range_header_text, upper_bound):
except:
pass
return (left, right)
return left, right
def get_request_range(request_headers, upper_bound):
first_byte_pos, last_byte_pos = __parse_request_range(request_headers['range'])
if first_byte_pos is None and last_byte_pos is None:
# Request full range
first_byte_pos = 0
last_byte_pos = upper_bound - 1
elif first_byte_pos is None:
# Request the last X bytes
first_byte_pos = max(0, upper_bound - last_byte_pos)
last_byte_pos = upper_bound - 1
elif last_byte_pos is None:
# Request the last X bytes
last_byte_pos = upper_bound - 1
return first_byte_pos, last_byte_pos