Skip to content

Commit 0a9bb61

Browse files
committed
Don't read all on response.close()
1 parent 815b326 commit 0a9bb61

File tree

3 files changed

+19
-23
lines changed

3 files changed

+19
-23
lines changed

adafruit_requests.py

+10-22
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,11 @@ class Response:
8686

8787
encoding = None
8888

89-
def __init__(
90-
self, sock: SocketType, session: "Session", fast_close: bool = False
91-
) -> None:
89+
def __init__(self, sock: SocketType, session: "Session") -> None:
9290
self.socket = sock
9391
self.encoding = "utf-8"
9492
self._cached = None
9593
self._headers = {}
96-
self._fast_close = fast_close
9794

9895
# _start_index and _receive_buffer are used when parsing headers.
9996
# _receive_buffer will grow by 32 bytes everytime it is too small.
@@ -230,27 +227,16 @@ def _throw_away(self, nbytes: int) -> None:
230227
to_read -= self._recv_into(buf, to_read)
231228

232229
def close(self) -> None:
233-
"""Drain the remaining ESP socket buffers. We assume we already got what we wanted."""
230+
"""Close out the socket. If we have a session free it instead."""
234231
if not self.socket:
235232
return
236-
# Make sure we've read all of our response.
237-
if self._cached is None and not self._fast_close:
238-
if self._remaining and self._remaining > 0:
239-
self._throw_away(self._remaining)
240-
elif self._chunked:
241-
while True:
242-
chunk_header = bytes(self._readto(b"\r\n")).split(b";", 1)[0]
243-
if not chunk_header:
244-
break
245-
chunk_size = int(bytes(chunk_header), 16)
246-
if chunk_size == 0:
247-
break
248-
self._throw_away(chunk_size + 2)
233+
249234
if self._session:
250235
# pylint: disable=protected-access
251236
self._session._connection_manager.free_socket(self.socket)
252237
else:
253238
self.socket.close()
239+
254240
self.socket = None
255241

256242
def _parse_headers(self) -> None:
@@ -365,13 +351,11 @@ def __init__(
365351
socket_pool: SocketpoolModuleType,
366352
ssl_context: Optional[SSLContextType] = None,
367353
session_id: Optional[str] = None,
368-
fast_close: Optional[bool] = False,
369354
) -> None:
370355
self._connection_manager = get_connection_manager(socket_pool)
371356
self._ssl_context = ssl_context
372357
self._session_id = session_id
373358
self._last_response = None
374-
self._fast_close = fast_close
375359

376360
@staticmethod
377361
def _check_headers(headers: Dict[str, str]):
@@ -389,7 +373,6 @@ def _check_headers(headers: Dict[str, str]):
389373
def _send(socket: SocketType, data: bytes):
390374
total_sent = 0
391375
while total_sent < len(data):
392-
# ESP32SPI sockets raise a RuntimeError when unable to send.
393376
try:
394377
sent = socket.send(data[total_sent:])
395378
except OSError as exc:
@@ -399,6 +382,7 @@ def _send(socket: SocketType, data: bytes):
399382
# Some worse error.
400383
raise
401384
except RuntimeError as exc:
385+
# ESP32SPI sockets raise a RuntimeError when unable to send.
402386
raise OSError(errno.EIO) from exc
403387
if sent is None:
404388
sent = len(data)
@@ -566,7 +550,7 @@ def request(
566550
if not socket:
567551
raise OutOfRetries("Repeated socket failures") from last_exc
568552

569-
resp = Response(socket, self, fast_close=self._fast_close) # our response
553+
resp = Response(socket, self) # our response
570554
if allow_redirects:
571555
if "location" in resp.headers and 300 <= resp.status_code <= 399:
572556
# a naive handler for redirects
@@ -594,6 +578,10 @@ def request(
594578
self._last_response = resp
595579
return resp
596580

581+
def options(self, url: str, **kw) -> Response:
582+
"""Send HTTP OPTIONS request"""
583+
return self.request("OPTIONS", url, **kw)
584+
597585
def head(self, url: str, **kw) -> Response:
598586
"""Send HTTP HEAD request"""
599587
return self.request("HEAD", url, **kw)

tests/method_test.py

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"DELETE",
1717
"GET",
1818
"HEAD",
19+
"OPTIONS",
1920
"PATCH",
2021
"POST",
2122
"PUT",

tests/reuse_test.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,14 @@ def test_get_twice(pool, requests_ssl):
5757

5858

5959
def test_get_twice_after_second(pool, requests_ssl):
60-
sock = mocket.Mocket(mocket.MOCK_RESPONSE + mocket.MOCK_RESPONSE)
60+
sock = mocket.Mocket(
61+
b"H"
62+
b"TTP/1.0 200 OK\r\nContent-Length: "
63+
b"70\r\n\r\nHTTP/1.0 2"
64+
b"H"
65+
b"TTP/1.0 200 OK\r\nContent-Length: "
66+
b"70\r\n\r\nHTTP/1.0 2"
67+
)
6168
pool.socket.return_value = sock
6269

6370
response = requests_ssl.get("https://" + mocket.MOCK_ENDPOINT_1)

0 commit comments

Comments
 (0)