diff options
author | Andrey Petrov <andrey.petrov@shazow.net> | 2012-02-25 15:19:28 -0800 |
---|---|---|
committer | Andrey Petrov <andrey.petrov@shazow.net> | 2012-02-25 15:19:28 -0800 |
commit | d1d5fd1fd1d23cf68035e465ee395f580f6aebbd (patch) | |
tree | 64bac9acf2a59d0cc86740cad6f94bd9d0dee8fc | |
parent | 90c3ffbbcc422d77d30b7ed9ba3ee9cea3475742 (diff) | |
download | urllib3-d1d5fd1fd1d23cf68035e465ee395f580f6aebbd.tar.gz |
Support multiple fields with the same name for multipart encoding. (Fixed #48)
-rw-r--r-- | test/with_dummyserver/test_connectionpool.py | 15 | ||||
-rw-r--r-- | urllib3/filepost.py | 14 |
2 files changed, 28 insertions, 1 deletions
diff --git a/test/with_dummyserver/test_connectionpool.py b/test/with_dummyserver/test_connectionpool.py index cbe69e8c..899568f2 100644 --- a/test/with_dummyserver/test_connectionpool.py +++ b/test/with_dummyserver/test_connectionpool.py @@ -60,6 +60,21 @@ class TestConnectionPool(HTTPDummyServerTestCase): r = self.pool.request('POST', '/upload', fields=fields) self.assertEqual(r.status, 200, r.data) + def test_one_name_multiple_values(self): + fields = [ + ('foo', 'a'), + ('foo', 'b'), + ] + + # urlencode + r = self.pool.request('GET', '/echo', fields=fields) + self.assertEqual(r.data, 'foo=a&foo=b') + + # multipart + r = self.pool.request('POST', '/echo', fields=fields) + self.assertEqual(r.data.count('name="foo"'), 2) + + def test_unicode_upload(self): fieldname = u('myfile') filename = u('\xe2\x99\xa5.txt') diff --git a/urllib3/filepost.py b/urllib3/filepost.py index e1ec8af7..1160ce9d 100644 --- a/urllib3/filepost.py +++ b/urllib3/filepost.py @@ -24,6 +24,18 @@ def get_content_type(filename): return mimetypes.guess_type(filename)[0] or 'application/octet-stream' +def iter_fields(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k,v) for k, v in fields) + + def encode_multipart_formdata(fields, boundary=None): """ Encode a dictionary of ``fields`` using the multipart/form-data mime format. @@ -42,7 +54,7 @@ def encode_multipart_formdata(fields, boundary=None): if boundary is None: boundary = choose_boundary() - for fieldname, value in six.iteritems(fields): + for fieldname, value in iter_fields(fields): body.write(b('--%s\r\n' % (boundary))) if isinstance(value, tuple): |