diff --git a/httpx/models.py b/httpx/models.py index df5d071589..32e412fc76 100644 --- a/httpx/models.py +++ b/httpx/models.py @@ -89,16 +89,10 @@ def __init__( params: QueryParamTypes = None, ) -> None: if isinstance(url, str): - self._uri_reference = rfc3986.api.uri_reference(url) + self._uri_reference = rfc3986.api.iri_reference(url).encode() else: self._uri_reference = url._uri_reference - # Handle IDNA domain names. - if self._uri_reference.authority: - idna_authority = self._uri_reference.authority.encode("idna").decode("ascii") - if idna_authority != self._uri_reference.authority: - self._uri_reference = self._uri_reference.copy_with(authority=idna_authority) - # Normalize scheme and domain name. if self.is_absolute_url: self._uri_reference = self._uri_reference.normalize() diff --git a/tests/models/test_url.py b/tests/models/test_url.py index 7c865f5a66..a556ed89a1 100644 --- a/tests/models/test_url.py +++ b/tests/models/test_url.py @@ -1,13 +1,65 @@ import pytest +import rfc3986 from httpx import URL from httpx.exceptions import InvalidURL -def test_idna_url(): - url = URL("http://中国.icom.museum:80/") - assert url == URL("http://xn--fiqs8s.icom.museum:80/") - assert url.host == "xn--fiqs8s.icom.museum" +@pytest.mark.parametrize( + "given,idna,host,scheme,port", + [ + ( + "http://中国.icom.museum:80/", + "http://xn--fiqs8s.icom.museum:80/", + "xn--fiqs8s.icom.museum", + "http", + 80, + ), + ( + "http://Königsgäßchen.de", + "http://xn--knigsgchen-b4a3dun.de", + "xn--knigsgchen-b4a3dun.de", + "http", + 80, + ), + ("https://faß.de", "https://xn--fa-hia.de", "xn--fa-hia.de", "https", 443), + ( + "https://βόλος.com:443", + "https://xn--nxasmm1c.com:443", + "xn--nxasmm1c.com", + "https", + 443, + ), + ( + "http://ශ්‍රී.com:444", + "http://xn--10cl1a0b660p.com:444", + "xn--10cl1a0b660p.com", + "http", + 444, + ), + ( + "https://نامه‌ای.com:4433", + "https://xn--mgba3gch31f060k.com:4433", + "xn--mgba3gch31f060k.com", + "https", + 4433, + ), + ], + ids=[ + "http_with_port", + "unicode_tr46_compat", + "https_without_port", + "https_with_port", + "http_with_custom_port", + "https_with_custom_port", + ], +) +def test_idna_url(given, idna, host, scheme, port): + url = URL(given) + assert url == URL(idna) + assert url.host == host + assert url.scheme == scheme + assert url.port == port def test_url():