From 40a0da093b423ca37feee2b85df7c3f0ce3cc96c Mon Sep 17 00:00:00 2001 From: Demetri Date: Fri, 2 Dec 2022 08:20:05 -0800 Subject: [PATCH] Add back in URL.raw with NamedTuple (#2481) * add back in URL.raw with NamedTuple * Update _urls.py * Update _urls.py Co-authored-by: Tom Christie --- httpx/_types.py | 11 +++++++++++ httpx/_urls.py | 17 ++++++++++++++++- tests/models/test_url.py | 10 ++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/httpx/_types.py b/httpx/_types.py index f3c1f6ef..6b610e14 100644 --- a/httpx/_types.py +++ b/httpx/_types.py @@ -16,6 +16,7 @@ from typing import ( Iterator, List, Mapping, + NamedTuple, Optional, Sequence, Tuple, @@ -31,6 +32,16 @@ if TYPE_CHECKING: # pragma: no cover PrimitiveData = Optional[Union[str, int, float, bool]] +RawURL = NamedTuple( + "RawURL", + [ + ("raw_scheme", bytes), + ("raw_host", bytes), + ("port", Optional[int]), + ("raw_path", bytes), + ], +) + URLTypes = Union["URL", str] QueryParamTypes = Union[ diff --git a/httpx/_urls.py b/httpx/_urls.py index ab39c2ec..f26b2eb2 100644 --- a/httpx/_urls.py +++ b/httpx/_urls.py @@ -6,7 +6,7 @@ import rfc3986 import rfc3986.exceptions from ._exceptions import InvalidURL -from ._types import PrimitiveData, QueryParamTypes, URLTypes +from ._types import PrimitiveData, QueryParamTypes, RawURL, URLTypes from ._utils import primitive_value_to_str @@ -311,6 +311,21 @@ class URL: """ return unquote(self._uri_reference.fragment or "") + @property + def raw(self) -> RawURL: + """ + Provides the (scheme, host, port, target) for the outgoing request. + + In older versions of `httpx` this was used in the low-level transport API. + We no longer use `RawURL`, and this property will be deprecated in a future release. + """ + return RawURL( + self.raw_scheme, + self.raw_host, + self.port, + self.raw_path, + ) + @property def is_absolute_url(self) -> bool: """ diff --git a/tests/models/test_url.py b/tests/models/test_url.py index 321cffb3..959681be 100644 --- a/tests/models/test_url.py +++ b/tests/models/test_url.py @@ -424,3 +424,13 @@ def test_ipv6_url_from_raw_url(host): assert url.host == "::ffff:192.168.0.1" assert url.netloc == b"[::ffff:192.168.0.1]" assert str(url) == "https://[::ffff:192.168.0.1]/" + + +def test_url_raw_compatibility(): + url = httpx.URL("https://www.example.com/path") + scheme, host, port, raw_path = url.raw + + assert scheme == b"https" + assert host == b"www.example.com" + assert port is None + assert raw_path == b"/path" -- 2.47.3