summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_urlparse.py
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2019-03-07 16:02:26 (GMT)
committerGitHub <noreply@github.com>2019-03-07 16:02:26 (GMT)
commit16e6f7dee7f02bb81aa6b385b982dcdda5b99286 (patch)
treed9d7e262a37abec0b9f756f23b6aa7a4295405b6 /Lib/test/test_urlparse.py
parent1f58f4fa6a0e3c60cee8df4a35c8dcf3903acde8 (diff)
downloadcpython-16e6f7dee7f02bb81aa6b385b982dcdda5b99286.zip
cpython-16e6f7dee7f02bb81aa6b385b982dcdda5b99286.tar.gz
cpython-16e6f7dee7f02bb81aa6b385b982dcdda5b99286.tar.bz2
bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201)
Diffstat (limited to 'Lib/test/test_urlparse.py')
-rw-r--r--Lib/test/test_urlparse.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py
index 9c71be5..0faf2bb 100644
--- a/Lib/test/test_urlparse.py
+++ b/Lib/test/test_urlparse.py
@@ -1,3 +1,5 @@
+import sys
+import unicodedata
import unittest
import urllib.parse
@@ -994,6 +996,27 @@ class UrlParseTestCase(unittest.TestCase):
expected.append(name)
self.assertCountEqual(urllib.parse.__all__, expected)
+ def test_urlsplit_normalization(self):
+ # Certain characters should never occur in the netloc,
+ # including under normalization.
+ # Ensure that ALL of them are detected and cause an error
+ illegal_chars = '/:#?@'
+ hex_chars = {'{:04X}'.format(ord(c)) for c in illegal_chars}
+ denorm_chars = [
+ c for c in map(chr, range(128, sys.maxunicode))
+ if (hex_chars & set(unicodedata.decomposition(c).split()))
+ and c not in illegal_chars
+ ]
+ # Sanity check that we found at least one such character
+ self.assertIn('\u2100', denorm_chars)
+ self.assertIn('\uFF03', denorm_chars)
+
+ for scheme in ["http", "https", "ftp"]:
+ for c in denorm_chars:
+ url = "{}://netloc{}false.netloc/path".format(scheme, c)
+ with self.subTest(url=url, char='{:04X}'.format(ord(c))):
+ with self.assertRaises(ValueError):
+ urllib.parse.urlsplit(url)
class Utility_Tests(unittest.TestCase):
"""Testcase to test the various utility functions in the urllib."""