diff --git a/httpretty/compat.py b/httpretty/compat.py index 41c909c1..6805cf63 100644 --- a/httpretty/compat.py +++ b/httpretty/compat.py @@ -59,9 +59,19 @@ def __repr__(self): try: # pragma: no cover from urllib.parse import urlsplit, urlunsplit, parse_qs, quote, quote_plus, unquote + unquote_utf8 = unquote except ImportError: # pragma: no cover from urlparse import urlsplit, urlunsplit, parse_qs, unquote from urllib import quote, quote_plus + def unquote_utf8(qs): + if isinstance(qs, text_type): + qs = qs.encode('utf-8') + s = unquote(qs) + if isinstance(s, byte_type): + return s.decode("utf-8") + else: + return s + try: # pragma: no cover from http.server import BaseHTTPRequestHandler diff --git a/httpretty/core.py b/httpretty/core.py index ddb1b1da..f2332008 100644 --- a/httpretty/core.py +++ b/httpretty/core.py @@ -50,6 +50,7 @@ urlsplit, parse_qs, unquote, + unquote_utf8, ClassTypes, basestring ) @@ -182,12 +183,11 @@ def __str__(self): ) def parse_querystring(self, qs): - expanded = decode_utf8(unquote(utf8(qs))) - + expanded = unquote_utf8(qs) parsed = parse_qs(expanded) result = {} - for k, v in parsed.iteritems(): - result[k] = map(decode_utf8, v) + for k in parsed: + result[k] = map(decode_utf8, parsed[k]) return result