From 0272f8908e2ac5079295161969258c61df5b7407 Mon Sep 17 00:00:00 2001 From: Dariusz Rybi Date: Fri, 1 Oct 2010 14:03:46 +0200 Subject: [PATCH 1/2] Fixed problem with multiple key values. --- oauth2/__init__.py | 6 +++--- tests/test_oauth.py | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/oauth2/__init__.py b/oauth2/__init__.py index 65c3f071..a1b387e5 100644 --- a/oauth2/__init__.py +++ b/oauth2/__init__.py @@ -31,9 +31,9 @@ import httplib2 try: - from urlparse import parse_qs, parse_qsl + from urlparse import parse_qs except ImportError: - from cgi import parse_qs, parse_qsl + from cgi import parse_qs VERSION = '1.0' # Hi Blaine! @@ -548,7 +548,7 @@ def request(self, uri, method="GET", body=None, headers=None, DEFAULT_CONTENT_TYPE) != DEFAULT_CONTENT_TYPE if body and method == "POST" and not is_multipart: - parameters = dict(parse_qsl(body)) + parameters = parse_qs(body) else: parameters = None diff --git a/tests/test_oauth.py b/tests/test_oauth.py index e2a87f97..62b834e4 100644 --- a/tests/test_oauth.py +++ b/tests/test_oauth.py @@ -1029,6 +1029,28 @@ def oauth_verifier(url): client.request(uri, 'GET') self.mox.VerifyAll() + def test_multiple_values_for_a_key(self): + self.mox.StubOutWithMock(httplib2.Http, 'request') + + client = oauth.Client(self.consumer, None) + uri = self._uri('two_legged') + body = 'multi=1&multi=2' + + expected_kwargs = { + 'method':'POST', + 'redirections':httplib2.DEFAULT_MAX_REDIRECTS, + 'connection_type':None, + 'headers':mox.IsA(dict), + } + def query_dict_verifier(query_str): + query = parse_qs(query_str) + return query['multi'] == ['1', '2'] + httplib2.Http.request(client, uri, body=mox.Func(query_dict_verifier), **expected_kwargs).AndReturn(None) + + self.mox.ReplayAll() + result = client.request(uri, 'POST', body=body) + self.mox.VerifyAll() + if __name__ == "__main__": unittest.main() From 2133c84bf6cc6bea154b5fd91a1e4a905e72964a Mon Sep 17 00:00:00 2001 From: Robert MacCloy Date: Tue, 2 Nov 2010 20:38:30 -0700 Subject: [PATCH 2/2] Fix bug with multi-valued params. --- oauth2/__init__.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/oauth2/__init__.py b/oauth2/__init__.py index a1b387e5..0e052c31 100644 --- a/oauth2/__init__.py +++ b/oauth2/__init__.py @@ -380,8 +380,17 @@ 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() - non_oauth_url_items = list([(k, v) for k, v in url_items if not k.startswith('oauth_')]) + url_items = [] + parameters = parse_qs(query, keep_blank_values=False) + for k, v in parameters.iteritems(): + if hasattr(v, '__iter__'): + for vx in v: + url_items.append((k, urllib.unquote(vx))) + else: + url_items.append((k, urllib.unquote(v[0]))) + + non_oauth_url_items = list([(k, v) for (k, v) in url_items if not k.startswith('oauth_')]) + items.extend(non_oauth_url_items) encoded_str = urllib.urlencode(sorted(items))