From 40849bffcb1bf9b68fd6d503bfb6b27eaae9d736 Mon Sep 17 00:00:00 2001 From: Stephen Brown II Date: Wed, 31 Jul 2019 08:41:40 -0500 Subject: [PATCH] Update IDNA encoding to 2008 spec (#161) * Update IDNA encoding to 2008 spec * Add Unicode IDNA Compatibility Processing * Parametrize idna test * Use rfc3986 iri_reference for IDNA names * Add test for IRI object * Remove test_iri as this interface has been removed --- httpx/models.py | 8 +----- tests/models/test_url.py | 60 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/httpx/models.py b/httpx/models.py index df5d0715..32e412fc 100644 --- a/httpx/models.py +++ b/httpx/models.py @@ -89,16 +89,10 @@ class URL: 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 7c865f5a..a556ed89 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(): -- 2.47.3