diff --git a/adafruit_requests.py b/adafruit_requests.py index 5bcf0e4..d15db69 100644 --- a/adafruit_requests.py +++ b/adafruit_requests.py @@ -102,11 +102,12 @@ class Response: It is still necessary to ``close`` the response object for correct management of sockets, including doing so implicitly via ``with requests.get(...) as response``.""" - def __init__(self, sock: SocketType, session: "Session") -> None: + def __init__(self, sock: SocketType, session: "Session", method: str) -> None: self.socket = sock self.encoding = "utf-8" self._cached = None self._headers = {} + self._method = method # _start_index and _receive_buffer are used when parsing headers. # _receive_buffer will grow by 32 bytes everytime it is too small. @@ -276,6 +277,15 @@ def _parse_headers(self) -> None: else: self._headers[title] = content + # does the body have a fixed length? (of zero) + if ( + self.status_code == 204 + or self.status_code == 304 + or 100 <= self.status_code < 200 # 1xx codes + or self._method == "HEAD" + ): + self._remaining = 0 + def _validate_not_gzip(self) -> None: """gzip encoding is not supported. Raise an exception if found.""" 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 if not socket: raise OutOfRetries("Repeated socket failures") from last_exc - resp = Response(socket, self) # our response + resp = Response(socket, self, method) # our response if allow_redirects: if "location" in resp.headers and 300 <= resp.status_code <= 399: # a naive handler for redirects diff --git a/tests/real_call_test.py b/tests/real_call_test.py new file mode 100644 index 0000000..3ef3627 --- /dev/null +++ b/tests/real_call_test.py @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: 2024 Justin Myers +# +# SPDX-License-Identifier: Unlicense + +"""Real call Tests""" + +import socket +import ssl + +import adafruit_connection_manager +import pytest + +import adafruit_requests + + +@pytest.mark.parametrize( + ("path", "status_code", "text_result", "json_keys"), + ( + ("get", 200, None, {"url": "https://httpbin.org/get"}), + ("status/200", 200, "", None), + ("status/204", 204, "", None), + ), +) +def test_gets(path, status_code, text_result, json_keys): + requests = adafruit_requests.Session(socket, ssl.create_default_context()) + with requests.get(f"https://httpbin.org/{path}") as response: + assert response.status_code == status_code + if text_result is not None: + assert response.text == text_result + if json_keys is not None: + for key, value in json_keys.items(): + assert response.json()[key] == value + + adafruit_connection_manager.connection_manager_close_all(release_references=True)