]> granicus.if.org Git - python/commitdiff
modify urlencode so sequences in the dict are treated as multivalued
authorSkip Montanaro <skip@pobox.com>
Sat, 20 Jan 2001 15:56:39 +0000 (15:56 +0000)
committerSkip Montanaro <skip@pobox.com>
Sat, 20 Jan 2001 15:56:39 +0000 (15:56 +0000)
parameters.  This closes the code part of patch 103314.

Lib/urllib.py

index 61fac28f02863c9395f52eba6dc3f8f0ad9dbcc0..f096151b88770baa7520f06bdec582893bc690d3 100644 (file)
@@ -1093,13 +1093,43 @@ def quote_plus(s, safe = ''):
     else:
         return quote(s, safe)
 
-def urlencode(dict):
-    """Encode a dictionary of form entries into a URL query string."""
+def urlencode(dict,doseq=0):
+    """Encode a dictionary of form entries into a URL query string.
+
+    If any values in the dict are sequences and doseq is true, each
+    sequence element is converted to a separate parameter.
+    """
     l = []
-    for k, v in dict.items():
-        k = quote_plus(str(k))
-        v = quote_plus(str(v))
-        l.append(k + '=' + v)
+    if not doseq:
+        # preserve old behavior
+        for k, v in dict.items():
+            k = quote_plus(str(k))
+            v = quote_plus(str(v))
+            l.append(k + '=' + v)
+    else:
+        for k, v in dict.items():
+            k = quote_plus(str(k))
+            if type(v) == types.StringType:
+                v = quote_plus(v)
+                l.append(k + '=' + v)
+            elif type(v) == types.UnicodeType:
+                # is there a reasonable way to convert to ASCII?
+                # encode generates a string, but "replace" or "ignore"
+                # lose information and "strict" can raise UnicodeError
+                v = quote_plus(v.encode("ASCII","replace"))
+                l.append(k + '=' + v)
+            else:
+                try:
+                    # is this a sufficient test for sequence-ness?
+                    x = len(v)
+                except TypeError:
+                    # not a sequence
+                    v = quote_plus(str(v))
+                    l.append(k + '=' + v)
+                else:
+                    # loop over the sequence
+                    for elt in v:
+                        l.append(k + '=' + quote_plus(str(elt)))
     return '&'.join(l)
 
 # Proxy handling