From 73b414ab4564486f2335f02a1727fd0f4d005608 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rube=CC=81n=20Abad?= Date: Wed, 13 Jul 2011 11:08:54 +0200 Subject: [PATCH] We can represent multivalued params with arrays --- requests/models.py | 13 +++++++------ test_requests.py | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/requests/models.py b/requests/models.py index a67691d..a8335d1 100644 --- a/requests/models.py +++ b/requests/models.py @@ -211,18 +211,19 @@ class Request(object): """Encode parameters in a piece of data. If the data supplied is a dictionary, encodes each parameter in it, and - returns the dictionary of encoded parameters, and a urlencoded version - of that. + returns a list of tuples containing the encoded parameters, and a urlencoded + version of that. Otherwise, assumes the data is already encoded appropriately, and returns it twice. """ if hasattr(data, 'items'): - result = {} - for (k, v) in data.items(): - result[k.encode('utf-8') if isinstance(k, unicode) else k] \ - = v.encode('utf-8') if isinstance(v, unicode) else v + result = [] + for k, vs in data.items(): + for v in isinstance(vs, list) and vs or [vs]: + result.append((k.encode('utf-8') if isinstance(k, unicode) else k, + v.encode('utf-8') if isinstance(v, unicode) else v)) return result, urllib.urlencode(result, doseq=True) else: return data, data diff --git a/test_requests.py b/test_requests.py index f2aded2..d4e50a6 100755 --- a/test_requests.py +++ b/test_requests.py @@ -325,6 +325,30 @@ class RequestsTestSuite(unittest.TestCase): r = requests.get(u'http://➡.ws/httpbin') self.assertEqual(r.url, HTTPBIN_URL) + def test_urlencoded_get_query_multivalued_param(self): + r = requests.get(httpbin('get'), params=dict(test=['foo','baz'])) + self.assertEquals(r.status_code, 200) + self.assertEquals(r.url, httpbin('get?test=foo&test=baz')) + + def test_urlencoded_post_querystring_multivalued(self): + r = requests.post(httpbin('post'), params=dict(test=['foo','baz'])) + self.assertEquals(r.status_code, 200) + self.assertEquals(r.headers['content-type'], 'application/json') + self.assertEquals(r.url, httpbin('post?test=foo&test=baz')) + rbody = json.loads(r.content) + self.assertEquals(rbody.get('form'), {}) # No form supplied + self.assertEquals(rbody.get('data'), '') + + def test_urlencoded_post_query_multivalued_and_data(self): + r = requests.post(httpbin('post'), params=dict(test=['foo','baz']), + data=dict(test2="foobar",test3=['foo','baz'])) + self.assertEquals(r.status_code, 200) + self.assertEquals(r.headers['content-type'], 'application/json') + self.assertEquals(r.url, httpbin('post?test=foo&test=baz')) + rbody = json.loads(r.content) + self.assertEquals(rbody.get('form'), dict(test2='foobar',test3='foo')) + self.assertEquals(rbody.get('data'), '') + if __name__ == '__main__': unittest.main() -- 2.7.4