summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Petrov <andrey.petrov@shazow.net>2012-02-25 15:19:28 -0800
committerAndrey Petrov <andrey.petrov@shazow.net>2012-02-25 15:19:28 -0800
commitd1d5fd1fd1d23cf68035e465ee395f580f6aebbd (patch)
tree64bac9acf2a59d0cc86740cad6f94bd9d0dee8fc
parent90c3ffbbcc422d77d30b7ed9ba3ee9cea3475742 (diff)
downloadurllib3-d1d5fd1fd1d23cf68035e465ee395f580f6aebbd.tar.gz
Support multiple fields with the same name for multipart encoding. (Fixed #48)
-rw-r--r--test/with_dummyserver/test_connectionpool.py15
-rw-r--r--urllib3/filepost.py14
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):