Allow for third argument in file dict value to support explicit
authorVinod Chandru <vinod.chandru@gmail.com>
Thu, 10 Jan 2013 03:29:28 +0000 (19:29 -0800)
committerVinod Chandru <vinod.chandru@gmail.com>
Thu, 10 Jan 2013 03:29:28 +0000 (19:29 -0800)
file content type.

AUTHORS.rst
requests/models.py
test_requests.py

index acc78e8..1244588 100644 (file)
@@ -118,3 +118,4 @@ Patches and Suggestions
 - Martijn Pieters
 - Jonatan Heyman
 - David Bonner <dbonner@gmail.com> @rascalking
+- Vinod Chandru
index 9ddea45..1b55038 100644 (file)
@@ -108,8 +108,12 @@ class RequestEncodingMixin(object):
 
         for (k, v) in files:
             # support for explicit filename
+            ft = None
             if isinstance(v, (tuple, list)):
-                fn, fp = v
+                if len(v) == 2:
+                    fn, fp = v
+                else:
+                    fn, fp, ft = v
             else:
                 fn = guess_filename(v) or k
                 fp = v
@@ -117,7 +121,12 @@ class RequestEncodingMixin(object):
                 fp = StringIO(fp)
             if isinstance(fp, bytes):
                 fp = BytesIO(fp)
-            new_fields.append((k, (fn, fp.read())))
+            
+            if ft:
+                new_v = (fn, fp.read(), ft)
+            else:
+                new_v = (fn, fp.read())
+            new_fields.append((k, new_v))
 
         body, content_type = encode_multipart_formdata(new_fields)
 
index 84d4e8b..fb48323 100644 (file)
@@ -255,6 +255,14 @@ class RequestsTestCase(unittest.TestCase):
                           files={'file': ('test_requests.py', open(__file__, 'rb'))})
         self.assertEqual(r.status_code, 200)
 
+    def test_custom_content_type(self):
+        r = requests.post(httpbin('post'),
+                          data={'stuff': json.dumps({'a': 123})},
+                          files={'file1': ('test_requests.py', open(__file__, 'rb')),
+                                 'file2': ('test_requests', open(__file__, 'rb'),
+                                           'text/py-content-type')})
+        self.assertEqual(r.status_code, 200)
+        self.assertTrue("text/py-content-type" in r.request.body)
 
 
 if __name__ == '__main__':