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
This commit is contained in:
parent
66754ad0c5
commit
40849bffcb
@ -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()
|
||||
|
||||
@ -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():
|
||||
|
||||
Loading…
Reference in New Issue
Block a user