Skip to content

Commit 8b20e5c

Browse files
committed
requests: Use BodyStream only when Content-Length is set.
Detect Content-Length while parsing headers; pass the socket through unchanged otherwise. Simplify BodyStream to require a byte count. Signed-off-by: Pablo Ventura <pablogventura@gmail.com>
1 parent 2e23599 commit 8b20e5c

2 files changed

Lines changed: 20 additions & 22 deletions

File tree

python-ecosys/requests/requests/__init__.py

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,19 @@
22

33

44
class BodyStream:
5-
def __init__(self, sock, remaining=None):
5+
def __init__(self, sock, remaining):
66
self._sock = sock
77
self._remaining = remaining
88

99
def read(self, n=-1):
1010
if self._remaining == 0:
1111
return b""
12-
if n < 0:
13-
if self._remaining is not None:
14-
n = self._remaining
15-
data = self._sock.read(n)
16-
else:
17-
if self._remaining is not None and n > self._remaining:
18-
n = self._remaining
19-
data = self._sock.read(n)
20-
if self._remaining is not None:
21-
self._remaining -= len(data)
22-
if self._remaining > 0 and not data:
23-
raise ValueError("Connection closed before Content-Length satisfied")
12+
if n < 0 or n > self._remaining:
13+
n = self._remaining
14+
data = self._sock.read(n)
15+
self._remaining -= len(data)
16+
if self._remaining > 0 and not data:
17+
raise ValueError("Connection closed before Content-Length satisfied")
2418
return data
2519

2620
def close(self):
@@ -181,6 +175,7 @@ def request(
181175
reason = ""
182176
if len(l) > 2:
183177
reason = l[2].rstrip()
178+
remaining = None
184179
while True:
185180
l = s.readline()
186181
if not l or l == b"\r\n":
@@ -199,7 +194,10 @@ def request(
199194
elif parse_headers is True:
200195
l = str(l, "utf-8")
201196
k, v = l.split(":", 1)
202-
resp_d[k] = v.strip()
197+
v = v.strip()
198+
resp_d[k] = v
199+
if k.lower() == "content-length":
200+
remaining = int(v)
203201
else:
204202
parse_headers(l, resp_d)
205203
except OSError:
@@ -215,13 +213,10 @@ def request(
215213
else:
216214
return request(method, redirect, data, json, headers, stream)
217215
else:
218-
remaining = None
219-
if resp_d is not None:
220-
for k, v in resp_d.items():
221-
if k.lower() == "content-length":
222-
remaining = int(v)
223-
break
224-
resp = Response(BodyStream(s, remaining))
216+
if remaining is not None:
217+
resp = Response(BodyStream(s, remaining))
218+
else:
219+
resp = Response(s)
225220
resp.status_code = status
226221
resp.reason = reason
227222
if resp_d is not None:

python-ecosys/requests/test_requests.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ def install_mock_socket():
4646

4747

4848
def request_bytes(response):
49-
return response.raw._sock._write_buffer.getvalue()
49+
raw = response.raw
50+
if hasattr(raw, "_sock"):
51+
raw = raw._sock
52+
return raw._write_buffer.getvalue()
5053

5154

5255
def assert_has(data, *parts):

0 commit comments

Comments
 (0)