1
0
mirror of https://github.com/kevin1024/vcrpy.git synced 2025-12-08 16:53:23 +00:00

Add support for posting files through requests. closes #121. Possibly #134.

This commit is contained in:
Ivan Malison
2015-03-24 13:27:23 -07:00
parent 7cd7264034
commit 6602a449b1
3 changed files with 24 additions and 1 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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)):