diff --git a/AUTHORS.rst b/AUTHORS.rst index acc78e8274..124458818d 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -118,3 +118,4 @@ Patches and Suggestions - Martijn Pieters - Jonatan Heyman - David Bonner @rascalking +- Vinod Chandru diff --git a/requests/models.py b/requests/models.py index 9ddea45f48..1b55038a80 100644 --- a/requests/models.py +++ b/requests/models.py @@ -108,8 +108,12 @@ def _encode_files(files, data): 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 @@ def _encode_files(files, data): 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) diff --git a/test_requests.py b/test_requests.py index ef94386522..4a7098279a 100644 --- a/test_requests.py +++ b/test_requests.py @@ -255,6 +255,14 @@ def test_different_encodings_dont_break_post(self): 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(b"text/py-content-type" in r.request.body) if __name__ == '__main__':