Skip to content

Commit 0f7ac7d

Browse files
committed
Add handling for cases where start is greater than end in a Range and change function name
1 parent 541f6b9 commit 0f7ac7d

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
@@ -700,7 +700,7 @@ def send_head(self):
700700
"""
701701
path = self.translate_path(self.path)
702702
f = None
703-
self.range = self.get_range()
703+
self.range = self.parse_range()
704704
if os.path.isdir(path):
705705
parts = urllib.parse.urlsplit(self.path)
706706
if not parts.path.endswith('/'):
@@ -937,7 +937,7 @@ def guess_type(self, path):
937937
return guess
938938
return 'application/octet-stream'
939939

940-
def get_range(self):
940+
def parse_range(self):
941941
"""Return a tuple of (start, end) representing the range header in
942942
the HTTP request. If the range header is missing or not resolvable,
943943
None is returned. This only supports single part ranges.
@@ -949,11 +949,13 @@ def get_range(self):
949949
m = re.match(r'bytes=(\d+)-(\d*)$', range_header)
950950
if not m:
951951
return None
952-
start = m.group(1)
952+
start = int(m.group(1))
953953
if not m.group(2):
954-
return int(start), None
955-
end = m.group(2)
956-
return int(start), int(end)
954+
return start, None
955+
end = int(m.group(2))
956+
if start > end:
957+
return None
958+
return start, end
957959

958960

959961
# 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)