summaryrefslogtreecommitdiffstats
path: root/Lib/urllib.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-08-03 19:19:24 (GMT)
committerGuido van Rossum <guido@python.org>2007-08-03 19:19:24 (GMT)
commitc0f2d2d345d5fe97f81554d49b273b3feb0e37ae (patch)
treef1e57383a03f8723af8ad68dc831732ad9000dbb /Lib/urllib.py
parent15863ea07ab4eed2d91ce55b274245e8d420723d (diff)
downloadcpython-c0f2d2d345d5fe97f81554d49b273b3feb0e37ae.zip
cpython-c0f2d2d345d5fe97f81554d49b273b3feb0e37ae.tar.gz
cpython-c0f2d2d345d5fe97f81554d49b273b3feb0e37ae.tar.bz2
SF patch# 1762940 by Joe Gregorio.
Fix test_cookielib and test_urllib2. (The changes to urllib make urllib.quote() work correctly for Unicode strings; but they don't fix test_urllib.)
Diffstat (limited to 'Lib/urllib.py')
-rw-r--r--Lib/urllib.py30
1 files changed, 21 insertions, 9 deletions
diff --git a/Lib/urllib.py b/Lib/urllib.py
index dcd906c..2037a9d 100644
--- a/Lib/urllib.py
+++ b/Lib/urllib.py
@@ -1133,7 +1133,23 @@ def unquote_plus(s):
always_safe = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
'abcdefghijklmnopqrstuvwxyz'
'0123456789' '_.-')
-_safemaps = {}
+_safe_quoters= {}
+
+class Quoter:
+ def __init__(self, safe):
+ self.cache = {}
+ self.safe = safe + always_safe
+
+ def __call__(self, c):
+ try:
+ return self.cache[c]
+ except KeyError:
+ if ord(c) < 256:
+ res = (c in self.safe) and c or ('%%%02X' % ord(c))
+ self.cache[c] = res
+ return res
+ else:
+ return "".join(['%%%02X' % i for i in c.encode("utf-8")])
def quote(s, safe = '/'):
"""quote('abc def') -> 'abc%20def'
@@ -1158,15 +1174,11 @@ def quote(s, safe = '/'):
"""
cachekey = (safe, always_safe)
try:
- safe_map = _safemaps[cachekey]
+ quoter = _safe_quoters[cachekey]
except KeyError:
- safe += always_safe
- safe_map = {}
- for i in range(256):
- c = chr(i)
- safe_map[c] = (c in safe) and c or ('%%%02X' % i)
- _safemaps[cachekey] = safe_map
- res = map(safe_map.__getitem__, s)
+ quoter = Quoter(safe)
+ _safe_quoters[cachekey] = quoter
+ res = map(quoter, s)
return ''.join(res)
def quote_plus(s, safe = ''):