summaryrefslogtreecommitdiffstats
path: root/Lib/urllib.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/urllib.py')
-rw-r--r--Lib/urllib.py52
1 files changed, 44 insertions, 8 deletions
diff --git a/Lib/urllib.py b/Lib/urllib.py
index 4492e99..8e11ba9 100644
--- a/Lib/urllib.py
+++ b/Lib/urllib.py
@@ -426,7 +426,7 @@ class URLopener:
dirs, file = dirs[:-1], dirs[-1]
if dirs and not dirs[0]: dirs = dirs[1:]
if dirs and not dirs[0]: dirs[0] = '/'
- key = (user, host, port, string.joinfields(dirs, '/'))
+ key = user, host, port, string.join(dirs, '/')
# XXX thread unsafe!
if len(self.ftpcache) > MAXFTPCACHE:
# Prune the cache, rather arbitrarily
@@ -1013,22 +1013,58 @@ def unquote_plus(s):
always_safe = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
'abcdefghijklmnopqrstuvwxyz'
- '0123456789' '_,.-')
+ '0123456789' '_.-')
+
+_fast_safe_test = always_safe + '/'
+_fast_safe = None
+
+def _fast_quote(s):
+ global _fast_safe
+ if _fast_safe is None:
+ _fast_safe = {}
+ for c in _fast_safe_test:
+ _fast_safe[c] = c
+ res = list(s)
+ for i in range(len(res)):
+ c = res[i]
+ if not _fast_safe.has_key(c):
+ res[i] = '%%%02x' % ord(c)
+ return string.join(res, '')
+
def quote(s, safe = '/'):
- """quote('abc def') -> 'abc%20def'."""
- # XXX Can speed this up an order of magnitude
+ """quote('abc def') -> 'abc%20def'
+
+ Each part of a URL, e.g. the path info, the query, etc., has a
+ different set of reserved characters that must be quoted.
+
+ RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists
+ the following reserved characters.
+
+ reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
+ "$" | ","
+
+ Each of these characters is reserved in some component of a URL,
+ but not necessarily in all of them.
+
+ By default, the quote function is intended for quoting the path
+ section of a URL. Thus, it will not encode '/'. This character
+ is reserved, but in typical usage the quote function is being
+ called on a path where the existing slash characters are used as
+ reserved characters.
+ """
safe = always_safe + safe
+ if _fast_safe_test == safe:
+ return _fast_quote(s)
res = list(s)
for i in range(len(res)):
c = res[i]
if c not in safe:
res[i] = '%%%02x' % ord(c)
- return string.joinfields(res, '')
+ return string.join(res, '')
-def quote_plus(s, safe = '/'):
- # XXX Can speed this up an order of magnitude
+def quote_plus(s, safe = ''):
+ """Quote the query fragment of a URL; replacing ' ' with '+'"""
if ' ' in s:
- # replace ' ' with '+'
l = string.split(s, ' ')
for i in range(len(l)):
l[i] = quote(l[i], safe)