Index: parse.py @@ -563,4 +563,8 @@ def quote_from_bytes(bs, safe='/'): return ''.join([quoter(char) for char in bs]) +def _squote_plus(k, safe, encoding, errors): + return (quote_plus(k, safe) if isinstance(k, bytes) + else quote_plus(str(k), safe, encoding, errors)) + def urlencode(query, doseq=False, safe='', encoding=None, errors=None): """Encode a sequence of two-element tuples or dictionary into a URL query string. @@ -597,30 +601,16 @@ def urlencode(query, doseq=False, safe=' "or mapping object").with_traceback(tb) - l = [] + eq = '='.join if not doseq: - for k, v in query: - 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) + l = [eq((_squote_plus(k, safe, encoding, errors), + _squote_plus(v, safe, encoding, errors))) + for k, v in query] else: + l = [] for k, v in query: - 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) + k = _squote_plus(k, safe, encoding, errors) + if isinstance(v, (str, bytes)): + l.append(eq((k, (quote_plus(v, safe) if isinstance(v, bytes) + else quote_plus(v, safe,encoding,errors))))) else: try: @@ -629,14 +619,9 @@ def urlencode(query, doseq=False, safe=' except TypeError: # not a sequence - v = quote_plus(str(v), safe, encoding, errors) - l.append(k + '=' + v) + l.append(eq((k, quote_plus(str(v),safe,encoding,errors)))) else: # loop over the sequence - for elt in v: - if isinstance(elt, bytes): - elt = quote_plus(elt, safe) - else: - elt = quote_plus(str(elt), safe, encoding, errors) - l.append(k + '=' + elt) + l.extend(eq((k, _squote_plus(elt, safe,encoding,errors))) + for elt in v) return '&'.join(l)