[Python-3000-checkins] r56709 - in python/branches/py3k-struni/Lib: cookielib.py test/test_urllib2.py urllib.py urllib2.py

guido.van.rossum python-3000-checkins at python.org
Fri Aug 3 21:19:25 CEST 2007


Author: guido.van.rossum
Date: Fri Aug  3 21:19:24 2007
New Revision: 56709

Modified:
   python/branches/py3k-struni/Lib/cookielib.py
   python/branches/py3k-struni/Lib/test/test_urllib2.py
   python/branches/py3k-struni/Lib/urllib.py
   python/branches/py3k-struni/Lib/urllib2.py
Log:
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.)


Modified: python/branches/py3k-struni/Lib/cookielib.py
==============================================================================
--- python/branches/py3k-struni/Lib/cookielib.py	(original)
+++ python/branches/py3k-struni/Lib/cookielib.py	Fri Aug  3 21:19:24 2007
@@ -644,8 +644,6 @@
     # 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

Modified: python/branches/py3k-struni/Lib/test/test_urllib2.py
==============================================================================
--- python/branches/py3k-struni/Lib/test/test_urllib2.py	(original)
+++ python/branches/py3k-struni/Lib/test/test_urllib2.py	Fri Aug  3 21:19:24 2007
@@ -1003,7 +1003,7 @@
         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)
 

Modified: python/branches/py3k-struni/Lib/urllib.py
==============================================================================
--- python/branches/py3k-struni/Lib/urllib.py	(original)
+++ python/branches/py3k-struni/Lib/urllib.py	Fri Aug  3 21:19:24 2007
@@ -1133,7 +1133,23 @@
 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 @@
     """
     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 = ''):

Modified: python/branches/py3k-struni/Lib/urllib2.py
==============================================================================
--- python/branches/py3k-struni/Lib/urllib2.py	(original)
+++ python/branches/py3k-struni/Lib/urllib2.py	Fri Aug  3 21:19:24 2007
@@ -679,7 +679,7 @@
             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 @@
         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)


More information about the Python-3000-checkins mailing list