Skip to content
This repository was archived by the owner on Jan 13, 2021. It is now read-only.

Commit 0a93a60

Browse files
committed
Use proper parser.
1 parent d3017e0 commit 0a93a60

File tree

2 files changed

+34
-17
lines changed

2 files changed

+34
-17
lines changed

hyper/http11/connection.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import socket
1111

1212
from .response import HTTP11Response
13+
from .parser import Parser
1314
from ..tls import wrap_socket, H2_NPN_PROTOCOLS
1415
from ..http20.bufsocket import BufferedSocket
1516
from ..common.headers import HTTPHeaderMap
@@ -63,6 +64,10 @@ def __init__(self, host, port=None, secure=None):
6364
#: Defaults to 64kB.
6465
self.network_buffer_size = 65536
6566

67+
#: The object used to perform HTTP/1.1 parsing. Needs to conform to
68+
#: the standard hyper parsing interface.
69+
self.parser = Parser()
70+
6671
def connect(self):
6772
"""
6873
Connect to the server specified when the object was created. This is a
@@ -132,21 +137,23 @@ def get_response(self):
132137
"""
133138
headers = HTTPHeaderMap()
134139

135-
# First read the header line and 'parse' it.
136-
status_line = self._sock.readline().tobytes().rstrip()
137-
version, code, reason = status_line.split(b' ', 2)
138-
code = int(code)
140+
response = None
141+
while response is None:
142+
# 'encourage' the socket to receive data.
143+
self._sock.fill()
144+
response = self.parser.parse_response(self._sock.buffer)
139145

140-
while True:
141-
line = self._sock.readline().tobytes()
142-
if len(line) <= 2:
143-
break
146+
for n, v in response.headers:
147+
headers[n.tobytes()] = v.tobytes()
144148

145-
name, val = line.split(b':', 1)
146-
val = val.lstrip().rstrip(b'\r\n')
147-
headers[name] = val
149+
self._sock.advance_buffer(response.consumed)
148150

149-
return HTTP11Response(code, reason, headers, self._sock)
151+
return HTTP11Response(
152+
response.status,
153+
response.msg.tobytes(),
154+
headers,
155+
self._sock
156+
)
150157

151158
def _send_headers(self, method, url, headers):
152159
"""

test/test_http11.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def test_get_response(self):
188188
c = HTTP11Connection('http2bin.org')
189189
c._sock = sock = DummySocket()
190190

191-
sock.buffer= BytesIO(
191+
sock._buffer= BytesIO(
192192
b"HTTP/1.1 201 No Content\r\n"
193193
b"Connection: close\r\n"
194194
b"Server: Socket\r\n"
@@ -211,7 +211,7 @@ def test_response_short_reads(self):
211211
c = HTTP11Connection('http2bin.org')
212212
c._sock = sock = DummySocket()
213213

214-
sock.buffer= BytesIO(
214+
sock._buffer= BytesIO(
215215
b"HTTP/1.1 200 OK\r\n"
216216
b"Content-Length: 15\r\n"
217217
b"\r\n"
@@ -301,23 +301,33 @@ def test_short_circuit_read(self):
301301
class DummySocket(object):
302302
def __init__(self):
303303
self.queue = []
304-
self.buffer = BytesIO()
304+
self._buffer = BytesIO()
305305
self.can_read = False
306306

307+
@property
308+
def buffer(self):
309+
return memoryview(self._buffer.getvalue())
310+
311+
def advance_buffer(self, amt):
312+
self._buffer.read(amt)
313+
307314
def send(self, data):
308315
if not isinstance(data, bytes):
309316
raise TypeError()
310317

311318
self.queue.append(data)
312319

313320
def recv(self, l):
314-
return memoryview(self.buffer.read(l))
321+
return memoryview(self._buffer.read(l))
315322

316323
def close(self):
317324
pass
318325

319326
def readline(self):
320-
return memoryview(self.buffer.readline())
327+
return memoryview(self._buffer.readline())
328+
329+
def fill(self):
330+
pass
321331

322332

323333
class DummyFile(object):

0 commit comments

Comments
 (0)