We can represent multivalued params with arrays
authorRubén Abad <ruabag@gmail.com>
Wed, 13 Jul 2011 09:08:54 +0000 (11:08 +0200)
committerRubén Abad <ruabag@gmail.com>
Wed, 13 Jul 2011 09:08:54 +0000 (11:08 +0200)
requests/models.py
test_requests.py

index a67691dd714d145d0e8b25c1a918623f5b8dbab9..a8335d1d53f4cedae30d05502fc871179c8f356d 100644 (file)
@@ -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
index f2aded247defbfe661058d2af463e77db1d25846..d4e50a6fc233c4ee2085c6ffb6584178501cdc99 100755 (executable)
@@ -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()