Skip to content

Commit 9bc811f

Browse files
committed
Add handling for cases where start is greater than end in a Range and change function name
1 parent e81d46e commit 9bc811f

2 files changed

Lines changed: 11 additions & 6 deletions

File tree

Lib/http/server.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,7 @@ def send_head(self):
706706
"""
707707
path = self.translate_path(self.path)
708708
f = None
709-
self.range = self.get_range()
709+
self.range = self.parse_range()
710710
if os.path.isdir(path):
711711
parts = urllib.parse.urlsplit(self.path)
712712
if not parts.path.endswith('/'):
@@ -944,7 +944,7 @@ def guess_type(self, path):
944944
return guess
945945
return 'application/octet-stream'
946946

947-
def get_range(self):
947+
def parse_range(self):
948948
"""Return a tuple of (start, end) representing the range header in
949949
the HTTP request. If the range header is missing or not resolvable,
950950
None is returned. This only supports single part ranges.
@@ -956,11 +956,13 @@ def get_range(self):
956956
m = re.match(r'bytes=(\d+)-(\d*)$', range_header)
957957
if not m:
958958
return None
959-
start = m.group(1)
959+
start = int(m.group(1))
960960
if not m.group(2):
961-
return int(start), None
962-
end = m.group(2)
963-
return int(start), int(end)
961+
return start, None
962+
end = int(m.group(2))
963+
if start > end:
964+
return None
965+
return start, end
964966

965967

966968
# Utilities for CGIHTTPRequestHandler

Lib/test/test_httpservers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,9 @@ def test_range_get(self):
557557
response = self.request(self.base_url + '/test', headers={'Range': 'bytes=100-200'})
558558
self.check_status_and_reason(response, HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE)
559559

560+
response = self.request(self.base_url + '/test', headers={'Range': 'bytes=4-3'})
561+
self.check_status_and_reason(response, HTTPStatus.OK, data=self.data)
562+
560563
response = self.request(self.base_url + '/test', headers={'Range': 'bytes=wrong format'})
561564
self.check_status_and_reason(response, HTTPStatus.OK, data=self.data)
562565

0 commit comments

Comments
 (0)