diff options
author | Alex Gaynor <alex.gaynor@gmail.com> | 2015-07-13 20:50:25 -0400 |
---|---|---|
committer | Alex Gaynor <alex.gaynor@gmail.com> | 2015-07-13 20:50:25 -0400 |
commit | 677c3d55cdbb332723fd1e0e5fe8829465d90c50 (patch) | |
tree | 0285d190e24aa0aab40a0eccc81958bea5724c42 /src | |
parent | b4c72cd7cf78ee0f031f28ab010bf2d303582294 (diff) | |
parent | e28d6c47eb73ab3d3297745873a25e0f6c0eae8e (diff) | |
download | cryptography-677c3d55cdbb332723fd1e0e5fe8829465d90c50.tar.gz cryptography-677c3d55cdbb332723fd1e0e5fe8829465d90c50.tar.bz2 cryptography-677c3d55cdbb332723fd1e0e5fe8829465d90c50.zip |
Merge pull request #2149 from reaperhulk/better-uri
expand UniformResourceIdentifier to parse and internally IDNA encode
Diffstat (limited to 'src')
-rw-r--r-- | src/cryptography/x509.py | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/cryptography/x509.py b/src/cryptography/x509.py index 8bed79e2..58e1a37c 100644 --- a/src/cryptography/x509.py +++ b/src/cryptography/x509.py @@ -13,6 +13,8 @@ import idna import six +from six.moves import urllib_parse + from cryptography import utils from cryptography.hazmat.primitives import hashes @@ -966,7 +968,31 @@ class UniformResourceIdentifier(object): if not isinstance(value, six.text_type): raise TypeError("value must be a unicode string") + parsed = urllib_parse.urlparse(value) + if not parsed.hostname: + netloc = "" + elif parsed.port: + netloc = ( + idna.encode(parsed.hostname) + + ":{0}".format(parsed.port).encode("ascii") + ).decode("ascii") + else: + netloc = idna.encode(parsed.hostname).decode("ascii") + + # Note that building a URL in this fashion means it should be + # semantically indistinguishable from the original but is not + # guaranteed to be exactly the same. + uri = urllib_parse.urlunparse(( + parsed.scheme, + netloc, + parsed.path, + parsed.params, + parsed.query, + parsed.fragment + )).encode("ascii") + self._value = value + self._encoded = uri value = utils.read_only_property("_value") |