Commit 14f1ad4a authored by Skip Montanaro's avatar Skip Montanaro

allow first param urlencode to be a sequence of two-element tuples - in this

case, the order of parameters in the output matches the order of the inputs.
parent 399b8af5
......@@ -1093,21 +1093,46 @@ def quote_plus(s, safe = ''):
else:
return quote(s, safe)
def urlencode(dict,doseq=0):
"""Encode a dictionary of form entries into a URL query string.
def urlencode(query,doseq=0):
"""Encode a sequence of two-element tuples or dictionary into a URL query string.
If any values in the dict are sequences and doseq is true, each
If any values in the query arg are sequences and doseq is true, each
sequence element is converted to a separate parameter.
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.
"""
if hasattr(query,"items"):
# mapping objects
query = query.items()
else:
# it's a bother at times that strings and string-like objects are
# sequences...
try:
# non-sequence items should not work with len()
x = len(query)
# non-empty strings will fail this
if len(query) and type(query[0]) != types.TupleType:
raise TypeError
# zero-length sequences of all types will get here and succeed,
# but that's a minor nit - since the original implementation
# allowed empty dicts that type of behavior probably should be
# preserved for consistency
except TypeError:
ty,va,tb = sys.exc_info()
raise TypeError, "not a valid non-string sequence or mapping object", tb
l = []
if not doseq:
# preserve old behavior
for k, v in dict.items():
for k, v in query:
k = quote_plus(str(k))
v = quote_plus(str(v))
l.append(k + '=' + v)
else:
for k, v in dict.items():
for k, v in query:
k = quote_plus(str(k))
if type(v) == types.StringType:
v = quote_plus(v)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment