"""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
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()