summaryrefslogtreecommitdiffstats
path: root/Lib/urllib/parse.py
diff options
context:
space:
mode:
authorSenthil Kumaran <orsenthil@gmail.com>2010-07-03 17:48:22 (GMT)
committerSenthil Kumaran <orsenthil@gmail.com>2010-07-03 17:48:22 (GMT)
commitdf022da3d87311e44213ea2e5f95cc6667d44d83 (patch)
treeca5dd75016520ee58d30a095dd6ca4ce5084eb05 /Lib/urllib/parse.py
parent85029334f6b6a8ce6131a4e91ccdb5bec76ec7af (diff)
downloadcpython-df022da3d87311e44213ea2e5f95cc6667d44d83.zip
cpython-df022da3d87311e44213ea2e5f95cc6667d44d83.tar.gz
cpython-df022da3d87311e44213ea2e5f95cc6667d44d83.tar.bz2
Fix Issue5468 - urlencode to handle bytes and other alternate encodings.
(Extensive tests provided). Patch by Dan Mahn.
Diffstat (limited to 'Lib/urllib/parse.py')
-rw-r--r--Lib/urllib/parse.py38
1 files changed, 30 insertions, 8 deletions
diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py
index ffb0ff7..c6ebcc9 100644
--- a/Lib/urllib/parse.py
+++ b/Lib/urllib/parse.py
@@ -559,7 +559,7 @@ def quote_from_bytes(bs, safe='/'):
_safe_quoters[safe] = quoter = Quoter(safe).__getitem__
return ''.join([quoter(char) for char in bs])
-def urlencode(query, doseq=False):
+def urlencode(query, doseq=False, safe='', encoding=None, errors=None):
"""Encode a sequence of two-element tuples or dictionary into a URL query string.
If any values in the query arg are sequences and doseq is true, each
@@ -568,6 +568,10 @@ def urlencode(query, doseq=False):
If the query arg is a sequence of two-element tuples, the order of the
parameters in the output will match the order of parameters in the
input.
+
+ The query arg may be either a string or a bytes type. When query arg is a
+ string, the safe, encoding and error parameters are sent the quote_plus for
+ encoding.
"""
if hasattr(query, "items"):
@@ -592,14 +596,28 @@ def urlencode(query, doseq=False):
l = []
if not doseq:
for k, v in query:
- k = quote_plus(str(k))
- v = quote_plus(str(v))
+ if isinstance(k, bytes):
+ k = quote_plus(k, safe)
+ else:
+ k = quote_plus(str(k), safe, encoding, errors)
+
+ if isinstance(v, bytes):
+ v = quote_plus(v, safe)
+ else:
+ v = quote_plus(str(v), safe, encoding, errors)
l.append(k + '=' + v)
else:
for k, v in query:
- k = quote_plus(str(k))
- if isinstance(v, str):
- v = quote_plus(v)
+ if isinstance(k, bytes):
+ k = quote_plus(k, safe)
+ else:
+ k = quote_plus(str(k), safe, encoding, errors)
+
+ if isinstance(v, bytes):
+ v = quote_plus(v, safe)
+ l.append(k + '=' + v)
+ elif isinstance(v, str):
+ v = quote_plus(v, safe, encoding, errors)
l.append(k + '=' + v)
else:
try:
@@ -607,12 +625,16 @@ def urlencode(query, doseq=False):
x = len(v)
except TypeError:
# not a sequence
- v = quote_plus(str(v))
+ v = quote_plus(str(v), safe, encoding, errors)
l.append(k + '=' + v)
else:
# loop over the sequence
for elt in v:
- l.append(k + '=' + quote_plus(str(elt)))
+ if isinstance(elt, bytes):
+ elt = quote_plus(elt, safe)
+ else:
+ elt = quote_plus(str(elt), safe, encoding, errors)
+ l.append(k + '=' + elt)
return '&'.join(l)
# Utilities to parse URLs (most of these return None for missing parts):