Merge pull request #1578 from rslinckx/master

http/message: Split request line as bytes to avoid splitting on 0x0A. Fixes #1577
This commit is contained in:
Benoit Chesneau 2017-09-02 16:10:22 +02:00 committed by GitHub
commit c171c15c63
4 changed files with 20 additions and 7 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": ''
}

View File

@ -78,8 +78,11 @@ class request(object):
yield lines
def send_bytes(self):
for d in str(self.data.decode("latin1")):
yield bytes(d.encode("latin1"))
for d in self.data:
if six.PY3:
yield bytes([d])
else:
yield d
def send_random(self):
maxs = round(len(self.data) / 10)