http/message: Split request line as bytes to avoid splitting on 0x0A. Fixes #1577

This commit is contained in:
Raphaël Slinckx 2017-08-25 10:50:34 +02:00
parent ccfb29871c
commit 15e901a5e5
3 changed files with 15 additions and 5 deletions

View File

@ -173,7 +173,7 @@ class Request(Message):
buf.write(rbuf)
line, rbuf = self.read_line(unreader, buf, self.limit_request_line)
self.parse_request_line(bytes_to_str(line))
self.parse_request_line(line)
buf = BytesIO()
buf.write(rbuf)
@ -301,10 +301,10 @@ class Request(Message):
"proxy_port": d_port
}
def parse_request_line(self, line):
bits = line.split(None, 2)
def parse_request_line(self, line_bytes):
bits = [bytes_to_str(bit) for bit in line_bytes.split(None, 2)]
if len(bits) != 3:
raise InvalidRequestLine(line)
raise InvalidRequestLine(bytes_to_str(line_bytes))
# Method
if not METH_RE.match(bits[0]):
@ -325,7 +325,7 @@ class Request(Message):
try:
parts = urlsplit(self.uri)
except ValueError:
raise InvalidRequestLine(line)
raise InvalidRequestLine(bytes_to_str(line_bytes))
self.path = parts.path or ""
self.query = parts.query or ""
self.fragment = parts.fragment or ""

View File

@ -0,0 +1,2 @@
GET /à%20k HTTP/1.0\r\n
\r\n

View File

@ -0,0 +1,8 @@
request = {
"method": "GET",
"uri": uri("/\xc3\xa0%20k"),
"version": (1, 0),
"headers": [
],
"body": ''
}