diff --git a/oauth2/__init__.py b/oauth2/__init__.py index 835270e3..1f6d653b 100644 --- a/oauth2/__init__.py +++ b/oauth2/__init__.py @@ -418,7 +418,7 @@ def to_url(self): except AttributeError: # must be python <2.5 query = base_url[4] - query = parse_qs(query) + query = parse_qs(query.encode('utf-8')) for k, v in self.items(): query.setdefault(k, []).append(v) @@ -469,7 +469,7 @@ def get_normalized_parameters(self): # Include any query string parameters from the provided URL query = urlparse.urlparse(self.url)[4] - url_items = self._split_url_string(query).items() + url_items = self._split_url_string(query) url_items = [(to_utf8(k), to_utf8(v)) for k, v in url_items if k != 'oauth_signature' ] items.extend(url_items) @@ -606,9 +606,11 @@ def _split_header(header): @staticmethod def _split_url_string(param_str): """Turn URL string into parameters.""" - parameters = parse_qs(param_str.encode('utf-8'), keep_blank_values=True) - for k, v in parameters.iteritems(): - parameters[k] = urllib.unquote(v[0]) + parsed = parse_qs(param_str.encode('utf-8'), keep_blank_values=True) + parameters = [] + for k, v in parsed.iteritems(): + for w in v: + parameters.append((k, w)) return parameters diff --git a/tests/test_oauth.py b/tests/test_oauth.py index 099e5794..572432d1 100644 --- a/tests/test_oauth.py +++ b/tests/test_oauth.py @@ -881,7 +881,7 @@ def test_from_request(self): exp = parse_qs(qs, keep_blank_values=False) for k, v in exp.iteritems(): - exp[k] = urllib.unquote(v[0]) + exp[k] = v[0] self.assertEquals(exp, req.copy()) @@ -924,6 +924,14 @@ def test_from_consumer_and_token(self): self.assertEquals(req['oauth_consumer_key'], con.key) self.assertEquals(tok.verifier, req['oauth_verifier']) + def test_split_url_string(self): + param_str = u"foo=bar&bar=édulcoré&baz=%25de" + + params = oauth.Request._split_url_string(param_str) + params.sort() + self.assertEquals(params, [('bar', 'édulcoré'), ('baz', '%de'), ('foo', 'bar')]) + + class SignatureMethod_Bad(oauth.SignatureMethod): name = "BAD"