From 5d866dd77c94779794950c7e4fe5ab8fcb549184 Mon Sep 17 00:00:00 2001 From: Olutobi Owoputi Date: Wed, 2 Dec 2015 14:43:06 -0800 Subject: [PATCH] support python 3.4 --- tests/integration/test_filter.py | 6 ++++-- tests/unit/test_filters.py | 19 +++++++++++-------- vcr/filters.py | 24 ++++++++++++++---------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/tests/integration/test_filter.py b/tests/integration/test_filter.py index f72d346..4cce275 100644 --- a/tests/integration/test_filter.py +++ b/tests/integration/test_filter.py @@ -96,9 +96,10 @@ def test_filter_callback(tmpdir): def test_decompress_gzip(tmpdir): url = 'http://httpbin.org/gzip' + request = Request(url, headers={'Accept-Encoding': ['gzip, deflate']}) cass_file = str(tmpdir.join('gzip_response.yaml')) with vcr.use_cassette(cass_file, decode_compressed_response=True): - urlopen(url) + urlopen(request) with vcr.use_cassette(cass_file) as cass: decoded_response = urlopen(url).read() assert_cassette_has_one_response(cass) @@ -107,9 +108,10 @@ def test_decompress_gzip(tmpdir): def test_decompress_deflate(tmpdir): url = 'http://httpbin.org/deflate' + request = Request(url, headers={'Accept-Encoding': ['gzip, deflate']}) cass_file = str(tmpdir.join('deflate_response.yaml')) with vcr.use_cassette(cass_file, decode_compressed_response=True): - urlopen(url) + urlopen(request) with vcr.use_cassette(cass_file) as cass: decoded_response = urlopen(url).read() assert_cassette_has_one_response(cass) diff --git a/tests/unit/test_filters.py b/tests/unit/test_filters.py index fa1f939..274a70c 100644 --- a/tests/unit/test_filters.py +++ b/tests/unit/test_filters.py @@ -1,3 +1,4 @@ +from six import BytesIO from vcr.filters import ( remove_headers, replace_headers, remove_query_parameters, replace_query_parameters, @@ -6,7 +7,6 @@ from vcr.filters import ( ) from vcr.compat import mock from vcr.request import Request -import cStringIO import gzip import json import zlib @@ -225,7 +225,7 @@ def test_decode_response_uncompressed(): def test_decode_response_deflate(): - body = 'deflate message' + body = b'deflate message' deflate_response = { 'body': {'string': zlib.compress(body)}, 'headers': { @@ -242,14 +242,17 @@ def test_decode_response_deflate(): } decoded_response = decode_response(deflate_response) assert decoded_response['body']['string'] == body - assert decoded_response['content-length'] == len(body) + assert decoded_response['headers']['content-length'] == [str(len(body))] def test_decode_response_gzip(): - body = 'gzip message' - buf = cStringIO.StringIO() - with gzip.GzipFile('a', fileobj=buf, mode='wb') as f: - f.write(body) + body = b'gzip message' + + buf = BytesIO() + f = gzip.GzipFile('a', fileobj=buf, mode='wb') + f.write(body) + f.close() + compressed_body = buf.getvalue() buf.close() gzip_response = { @@ -268,4 +271,4 @@ def test_decode_response_gzip(): } decoded_response = decode_response(gzip_response) assert decoded_response['body']['string'] == body - assert decoded_response['content-length'] == len(body) + assert decoded_response['headers']['content-length'] == [str(len(body))] diff --git a/vcr/filters.py b/vcr/filters.py index e6e10fd..db6c130 100644 --- a/vcr/filters.py +++ b/vcr/filters.py @@ -1,8 +1,11 @@ from six import BytesIO, text_type from six.moves.urllib.parse import urlparse, urlencode, urlunparse +import copy import json import zlib +from .util import CaseInsensitiveDict + def replace_headers(request, replacements): """ @@ -130,8 +133,8 @@ def decode_response(response): 2. delete the content-encoding header 3. update content-length header to decompressed length """ - def is_compressed(response): - encoding = response['headers'].get('content-encoding', []) + def is_compressed(headers): + encoding = headers.get('content-encoding', []) return encoding and encoding[0] in ('gzip', 'deflate') def decompress_body(body, encoding): @@ -143,15 +146,16 @@ def decode_response(response): else: # encoding == 'deflate' return zlib.decompress(body) - if is_compressed(response): - response = response.copy() - encoding = response['headers']['content-encoding'][0] - - response['headers']['content-encoding'].remove(encoding) - if not response['headers']['content-encoding']: - del response['headers']['content-encoding'] + headers = CaseInsensitiveDict(response['headers']) + if is_compressed(headers): + response = copy.deepcopy(response) + encoding = headers['content-encoding'][0] + headers['content-encoding'].remove(encoding) + if not headers['content-encoding']: + del headers['content-encoding'] new_body = decompress_body(response['body']['string'], encoding) response['body']['string'] = new_body - response['content-length'] = len(new_body) + headers['content-length'] = [str(len(new_body))] + response['headers'] = dict(headers) return response