diff options
-rw-r--r-- | Lib/cookielib.py | 2 | ||||
-rw-r--r-- | Lib/test/test_urllib2.py | 2 | ||||
-rw-r--r-- | Lib/urllib.py | 30 | ||||
-rw-r--r-- | Lib/urllib2.py | 4 |
4 files changed, 24 insertions, 14 deletions
diff --git a/Lib/cookielib.py b/Lib/cookielib.py index 7c794d4..313912e 100644 --- a/Lib/cookielib.py +++ b/Lib/cookielib.py @@ -644,8 +644,6 @@ def escape_path(path): # And here, kind of: draft-fielding-uri-rfc2396bis-03 # (And in draft IRI specification: draft-duerst-iri-05) # (And here, for new URI schemes: RFC 2718) - if isinstance(path, str): - path = path.encode("utf-8") path = urllib.quote(path, HTTP_PATH_SAFE) path = ESCAPED_CHAR_RE.sub(uppercase_escaped_char, path) return path diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 488e9e2..e3e6de2 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1003,7 +1003,7 @@ class HandlerTests(unittest.TestCase): self.assertEqual(len(http_handler.requests), 2) self.assertFalse(http_handler.requests[0].has_header(auth_header)) userpass = '%s:%s' % (user, password) - auth_hdr_value = 'Basic '+base64.encodestring(userpass).strip() + auth_hdr_value = 'Basic ' + str(base64.encodestring(userpass)).strip() self.assertEqual(http_handler.requests[1].get_header(auth_header), auth_hdr_value) 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 = ''): diff --git a/Lib/urllib2.py b/Lib/urllib2.py index 9c773fc..c8bfe38 100644 --- a/Lib/urllib2.py +++ b/Lib/urllib2.py @@ -679,7 +679,7 @@ class ProxyHandler(BaseHandler): proxy_type = orig_type if user and password: user_pass = '%s:%s' % (unquote(user), unquote(password)) - creds = base64.b64encode(user_pass).strip() + creds = str(base64.b64encode(user_pass)).strip() req.add_header('Proxy-authorization', 'Basic ' + creds) hostport = unquote(hostport) req.set_proxy(hostport, proxy_type) @@ -802,7 +802,7 @@ class AbstractBasicAuthHandler: user, pw = self.passwd.find_user_password(realm, host) if pw is not None: raw = "%s:%s" % (user, pw) - auth = 'Basic %s' % base64.b64encode(raw).strip() + auth = 'Basic %s' % str(base64.b64encode(raw)).strip() if req.headers.get(self.auth_header, None) == auth: return None req.add_header(self.auth_header, auth) |