Kaydet (Commit) f3e9b2a9 authored tarafından Senthil Kumaran's avatar Senthil Kumaran

Fix for Issue8135 - urllib.unquote to support mixed percent escapes

üst 43fe03a2
...@@ -439,6 +439,32 @@ class UnquotingTests(unittest.TestCase): ...@@ -439,6 +439,32 @@ class UnquotingTests(unittest.TestCase):
"using unquote(): not all characters escaped: " "using unquote(): not all characters escaped: "
"%s" % result) "%s" % result)
def test_unquoting_badpercent(self):
# Test unquoting on bad percent-escapes
given = '%xab'
expect = given
result = urllib.unquote(given)
self.assertEqual(expect, result, "using unquote(): %r != %r"
% (expect, result))
given = '%x'
expect = given
result = urllib.unquote(given)
self.assertEqual(expect, result, "using unquote(): %r != %r"
% (expect, result))
given = '%'
expect = given
result = urllib.unquote(given)
self.assertEqual(expect, result, "using unquote(): %r != %r"
% (expect, result))
def test_unquoting_mixed_case(self):
# Test unquoting on mixed-case hex digits in the percent-escapes
given = '%Ab%eA'
expect = '\xab\xea'
result = urllib.unquote(given)
self.assertEqual(expect, result, "using unquote(): %r != %r"
% (expect, result))
def test_unquoting_parts(self): def test_unquoting_parts(self):
# Make sure unquoting works when have non-quoted characters # Make sure unquoting works when have non-quoted characters
# interspersed # interspersed
......
...@@ -1158,8 +1158,8 @@ def splitvalue(attr): ...@@ -1158,8 +1158,8 @@ def splitvalue(attr):
if match: return match.group(1, 2) if match: return match.group(1, 2)
return attr, None return attr, None
_hextochr = dict(('%02x' % i, chr(i)) for i in range(256)) _hexdig = '0123456789ABCDEFabcdef'
_hextochr.update(('%02X' % i, chr(i)) for i in range(256)) _hextochr = dict((a+b, chr(int(a+b,16))) for a in _hexdig for b in _hexdig)
def unquote(s): def unquote(s):
"""unquote('abc%20def') -> 'abc def'.""" """unquote('abc%20def') -> 'abc def'."""
......
...@@ -272,8 +272,9 @@ def urldefrag(url): ...@@ -272,8 +272,9 @@ def urldefrag(url):
# Cannot use directly from urllib as it would create circular reference. # Cannot use directly from urllib as it would create circular reference.
# urllib uses urlparse methods ( urljoin) # urllib uses urlparse methods ( urljoin)
_hextochr = dict(('%02x' % i, chr(i)) for i in range(256))
_hextochr.update(('%02X' % i, chr(i)) for i in range(256)) _hexdig = '0123456789ABCDEFabcdef'
_hextochr = dict((a+b, chr(int(a+b,16))) for a in _hexdig for b in _hexdig)
def unquote(s): def unquote(s):
"""unquote('abc%20def') -> 'abc def'.""" """unquote('abc%20def') -> 'abc def'."""
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment