From b948ed48577bcda56f8c12c9f27a0030455aa94b Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Tue, 24 Mar 2015 15:41:14 -0700 Subject: [PATCH] Fix python3 support for requests file uploads. --- tests/integration/test_requests.py | 4 ++-- vcr/request.py | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/integration/test_requests.py b/tests/integration/test_requests.py index fc22198..f14d0d2 100644 --- a/tests/integration/test_requests.py +++ b/tests/integration/test_requests.py @@ -211,9 +211,9 @@ def test_post_file(tmpdir, scheme): # This also tests that we do the right thing with matching the body when they are files. with vcr.use_cassette(str(tmpdir.join('post_file.yaml')), match_on=('method', 'scheme', 'host', 'port', 'path', 'query', 'body')) as cass: - with open('tox.ini') as f: + with open('tox.ini', 'rb') as f: tox_content = f.read() assert cass.requests[0].body.read() == tox_content - with open('tox.ini') as f: + with open('tox.ini', 'rb') as f: new_response = requests.post(url, f).content assert original_response == new_response diff --git a/vcr/request.py b/vcr/request.py index 82eaf6d..fbc02e1 100644 --- a/vcr/request.py +++ b/vcr/request.py @@ -1,4 +1,4 @@ -import StringIO +from six import BytesIO, binary_type from six.moves.urllib.parse import urlparse, parse_qsl @@ -28,14 +28,19 @@ class Request(object): self.method = method self.uri = uri self._was_file = hasattr(body, 'read') - self._body = body.read() if self._was_file else body + if self._was_file: + self._body = body.read() + if not isinstance(self._body, binary_type): + self._body = self._body.encode('utf-8') + else: + self._body = body self.headers = {} for key in headers: self.add_header(key, headers[key]) @property def body(self): - return StringIO.StringIO(self._body) if self._was_file else self._body + return BytesIO(self._body) if self._was_file else self._body @body.setter def body(self, value):