Skip to content

Commit d72cfb9

Browse files
authored
Merge pull request #213 from justmobilize/204-fix
204 Fix
2 parents 6c33451 + d4acdd0 commit d72cfb9

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

adafruit_requests.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,12 @@ class Response:
102102
It is still necessary to ``close`` the response object for correct management of
103103
sockets, including doing so implicitly via ``with requests.get(...) as response``."""
104104

105-
def __init__(self, sock: SocketType, session: "Session") -> None:
105+
def __init__(self, sock: SocketType, session: "Session", method: str) -> None:
106106
self.socket = sock
107107
self.encoding = "utf-8"
108108
self._cached = None
109109
self._headers = {}
110+
self._method = method
110111

111112
# _start_index and _receive_buffer are used when parsing headers.
112113
# _receive_buffer will grow by 32 bytes everytime it is too small.
@@ -276,6 +277,15 @@ def _parse_headers(self) -> None:
276277
else:
277278
self._headers[title] = content
278279

280+
# does the body have a fixed length? (of zero)
281+
if (
282+
self.status_code == 204
283+
or self.status_code == 304
284+
or 100 <= self.status_code < 200 # 1xx codes
285+
or self._method == "HEAD"
286+
):
287+
self._remaining = 0
288+
279289
def _validate_not_gzip(self) -> None:
280290
"""gzip encoding is not supported. Raise an exception if found."""
281291
if "content-encoding" in self.headers and self.headers["content-encoding"] == "gzip":
@@ -670,7 +680,7 @@ def request( # noqa: PLR0912,PLR0913,PLR0915 Too many branches,Too many argumen
670680
if not socket:
671681
raise OutOfRetries("Repeated socket failures") from last_exc
672682

673-
resp = Response(socket, self) # our response
683+
resp = Response(socket, self, method) # our response
674684
if allow_redirects:
675685
if "location" in resp.headers and 300 <= resp.status_code <= 399:
676686
# a naive handler for redirects

tests/real_call_test.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# SPDX-FileCopyrightText: 2024 Justin Myers
2+
#
3+
# SPDX-License-Identifier: Unlicense
4+
5+
"""Real call Tests"""
6+
7+
import socket
8+
import ssl
9+
10+
import adafruit_connection_manager
11+
import pytest
12+
13+
import adafruit_requests
14+
15+
16+
@pytest.mark.parametrize(
17+
("path", "status_code", "text_result", "json_keys"),
18+
(
19+
("get", 200, None, {"url": "https://httpbin.org/get"}),
20+
("status/200", 200, "", None),
21+
("status/204", 204, "", None),
22+
),
23+
)
24+
def test_gets(path, status_code, text_result, json_keys):
25+
requests = adafruit_requests.Session(socket, ssl.create_default_context())
26+
with requests.get(f"https://httpbin.org/{path}") as response:
27+
assert response.status_code == status_code
28+
if text_result is not None:
29+
assert response.text == text_result
30+
if json_keys is not None:
31+
for key, value in json_keys.items():
32+
assert response.json()[key] == value
33+
34+
adafruit_connection_manager.connection_manager_close_all(release_references=True)

0 commit comments

Comments
 (0)