Use BytesIO for bytes.
authorJakub Roztocil <jakub@roztocil.name>
Mon, 30 Jul 2012 08:35:47 +0000 (10:35 +0200)
committerJakub Roztocil <jakub@roztocil.name>
Fri, 10 Aug 2012 17:49:03 +0000 (19:49 +0200)
This fixes a TypeError on Python 3 that ocurred when passing
bytes as the values for files.

requests/models.py
tests/test_requests.py

index 1a74dc2..136427f 100644 (file)
@@ -10,6 +10,7 @@ This module contains the primary objects that power Requests.
 import os
 import socket
 from datetime import datetime
+from io import BytesIO
 
 from .hooks import dispatch_hook, HOOKS
 from .structures import CaseInsensitiveDict
@@ -377,8 +378,10 @@ class Request(object):
             else:
                 fn = guess_filename(v) or k
                 fp = v
-            if isinstance(fp, (bytes, str)):
+            if isinstance(fp, str):
                 fp = StringIO(fp)
+            if isinstance(fp, bytes):
+                fp = BytesIO(fp)
             fields.append((k, (fn, fp.read())))
 
         for k, vs in tuples(self.data):
index abc57e1..e196af4 100755 (executable)
@@ -7,7 +7,6 @@
 import sys
 import os
 sys.path.insert(0, os.path.abspath('..'))
-
 import json
 import os
 import unittest
@@ -1030,7 +1029,9 @@ class RequestsTestSuite(TestSetup, TestBaseMixin, unittest.TestCase):
 
     def test_post_fields_with_multiple_values_and_files_as_tuples(self):
         """Test that it is possible to POST multiple data and file fields
-        with the same name."""
+        with the same name.
+        https://github.com/kennethreitz/requests/pull/746
+        """
 
         data = [
             ('__field__', '__value__'),
@@ -1061,6 +1062,10 @@ class RequestsTestSuite(TestSetup, TestBaseMixin, unittest.TestCase):
         self.assertEqual(body.count('__value__'), 4)
         self.assertEqual(body.count(file_field), 2)
 
+    def test_bytes_files(self):
+        """Test that `bytes` can be used as the values of `files`."""
+        post(httpbin('post'), files={'test': b'test'})
+
 
 if __name__ == '__main__':
     unittest.main()