From 0484ea2c9142ddab602eb87b0cc5274ced809743 Mon Sep 17 00:00:00 2001 From: David Shirley Date: Mon, 26 Jan 2015 14:54:36 -0800 Subject: [PATCH] Tidied the /range controller code Extracted some of the range processing logic into a separate function --- httpbin/core.py | 18 ++---------------- httpbin/helpers.py | 27 ++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/httpbin/core.py b/httpbin/core.py index a37a38d..8c69dcb 100644 --- a/httpbin/core.py +++ b/httpbin/core.py @@ -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={ diff --git a/httpbin/helpers.py b/httpbin/helpers.py index 15805fb..7213cf8 100644 --- a/httpbin/helpers.py +++ b/httpbin/helpers.py @@ -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