From 6602a449b15774676fa89f1431f9c1d1c56547b4 Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Tue, 24 Mar 2015 13:27:23 -0700 Subject: [PATCH] Add support for posting files through requests. closes #121. Possibly #134. --- tests/integration/test_requests.py | 15 +++++++++++++++ vcr/matchers.py | 2 ++ vcr/request.py | 8 +++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/tests/integration/test_requests.py b/tests/integration/test_requests.py index 30cf774..da40239 100644 --- a/tests/integration/test_requests.py +++ b/tests/integration/test_requests.py @@ -199,3 +199,18 @@ def test_nested_cassettes_with_session_created_before_nesting(scheme, tmpdir): # Make sure that the session can now get content normally. session.get('http://www.reddit.com') + +def test_post_file(tmpdir, scheme): + '''Ensure that we handle posting a file.''' + url = scheme + '://httpbin.org/post' + with vcr.use_cassette(str(tmpdir.join('post_file.yaml'))) as cass, open('tox.ini') as f: + original_response = requests.post(url, f).content + + # 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, open('tox.ini') as f: + tox_content = f.read() + assert cass.requests[0].body.read() == tox_content + with open('tox.ini') as f: + new_response = requests.post(url, f).content + assert original_response == new_response diff --git a/vcr/matchers.py b/vcr/matchers.py index d24875c..91bce11 100644 --- a/vcr/matchers.py +++ b/vcr/matchers.py @@ -31,6 +31,8 @@ def query(r1, r2): def body(r1, r2): + if hasattr(r1.body, 'read') and hasattr(r2.body, 'read'): + return r1.body.read() == r2.body.read() return r1.body == r2.body diff --git a/vcr/request.py b/vcr/request.py index 0525732..26ba917 100644 --- a/vcr/request.py +++ b/vcr/request.py @@ -1,3 +1,4 @@ +import StringIO from six.moves.urllib.parse import urlparse, parse_qsl @@ -26,11 +27,16 @@ class Request(object): def __init__(self, method, uri, body, headers): self.method = method self.uri = uri - self.body = body + self._was_file = hasattr(body, 'read') + self._body = body.read() if self._was_file else 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 + def add_header(self, key, value): # see class docstring for an explanation if isinstance(value, (tuple, list)):