mirror of
https://github.com/kennethreitz/httpbin.git
synced 2026-06-05 23:00:18 +00:00
Tidied the /range controller code
Extracted some of the range processing logic into a separate function
This commit is contained in:
+2
-16
@@ -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
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user