From ccc1ccaa0e2314fa3f89460869a9c0a470eb7fef Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 24 Jun 2015 16:23:00 +0100 Subject: [PATCH 1/2] Allow filtering post params in requests --- tests/integration/test_requests.py | 13 +++++++++++++ vcr/filters.py | 7 +++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/integration/test_requests.py b/tests/integration/test_requests.py index f14d0d2..656754e 100644 --- a/tests/integration/test_requests.py +++ b/tests/integration/test_requests.py @@ -217,3 +217,16 @@ def test_post_file(tmpdir, scheme): with open('tox.ini', 'rb') as f: new_response = requests.post(url, f).content assert original_response == new_response + + +def test_filter_post_params(tmpdir, scheme): + ''' + This tests the issue in https://github.com/kevin1024/vcrpy/issues/158 + + Ensure that a post request made through requests can still be filtered. + ''' + url = scheme + '://httpbin.org/post' + cass_loc = str(tmpdir.join('filter_post_params.yaml')) + with vcr.use_cassette(cass_loc, filter_post_data_parameters=['key']) as cass: + requests.post(url, data={'key': 'value'}) + diff --git a/vcr/filters.py b/vcr/filters.py index 7217813..84f06c8 100644 --- a/vcr/filters.py +++ b/vcr/filters.py @@ -1,4 +1,4 @@ -from six import BytesIO +from six import BytesIO, text_type from six.moves.urllib.parse import urlparse, urlencode, urlunparse try: from collections import OrderedDict @@ -41,7 +41,10 @@ def remove_post_data_parameters(request, post_data_parameters_to_remove): request.body = json.dumps(json_data).encode('utf-8') else: post_data = OrderedDict() - for k, sep, v in [p.partition(b'=') for p in request.body.split(b'&')]: + if isinstance(request.body, text_type): + request.body = request.body.encode('utf-8') + + for k, sep, v in (p.partition(b'=') for p in request.body.split(b'&')): if k in post_data: post_data[k].append(v) elif len(k) > 0 and k.decode('utf-8') not in post_data_parameters_to_remove: From e742d32a8aaf5ec4592476189423f5ab78544275 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 24 Jun 2015 16:27:45 +0100 Subject: [PATCH 2/2] Update test to ensure that filter is correctly applied --- tests/integration/test_requests.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/integration/test_requests.py b/tests/integration/test_requests.py index 656754e..79e74b8 100644 --- a/tests/integration/test_requests.py +++ b/tests/integration/test_requests.py @@ -224,9 +224,13 @@ def test_filter_post_params(tmpdir, scheme): This tests the issue in https://github.com/kevin1024/vcrpy/issues/158 Ensure that a post request made through requests can still be filtered. + with vcr.use_cassette(cass_file, filter_post_data_parameters=['id']) as cass: + assert b'id=secret' not in cass.requests[0].body ''' url = scheme + '://httpbin.org/post' cass_loc = str(tmpdir.join('filter_post_params.yaml')) with vcr.use_cassette(cass_loc, filter_post_data_parameters=['key']) as cass: requests.post(url, data={'key': 'value'}) + with vcr.use_cassette(cass_loc, filter_post_data_parameters=['key']) as cass: + assert b'key=value' not in cass.requests[0].body