From 438a65426b3eac33cd42ce56f20b4ac34a5dc3f6 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Wed, 21 Jun 2023 02:19:58 +0200 Subject: [PATCH] filters.py: Make decompression robust towards decompressed input --- tests/unit/test_filters.py | 24 ++++++++++++++++++++++++ vcr/filters.py | 10 ++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_filters.py b/tests/unit/test_filters.py index 370699d..003e08e 100644 --- a/tests/unit/test_filters.py +++ b/tests/unit/test_filters.py @@ -298,6 +298,18 @@ def test_decode_response_deflate(): assert decoded_response["headers"]["content-length"] == [str(len(body))] +def test_decode_response_deflate_already_decompressed(): + body = b"deflate message" + gzip_response = { + "body": {"string": body}, + "headers": { + "content-encoding": ["deflate"], + }, + } + decoded_response = decode_response(gzip_response) + assert decoded_response["body"]["string"] == body + + def test_decode_response_gzip(): body = b"gzip message" @@ -325,3 +337,15 @@ def test_decode_response_gzip(): decoded_response = decode_response(gzip_response) assert decoded_response["body"]["string"] == body assert decoded_response["headers"]["content-length"] == [str(len(body))] + + +def test_decode_response_gzip_already_decompressed(): + body = b"gzip message" + gzip_response = { + "body": {"string": body}, + "headers": { + "content-encoding": ["gzip"], + }, + } + decoded_response = decode_response(gzip_response) + assert decoded_response["body"]["string"] == body diff --git a/vcr/filters.py b/vcr/filters.py index 751c5d4..ac07fb0 100644 --- a/vcr/filters.py +++ b/vcr/filters.py @@ -153,9 +153,15 @@ def decode_response(response): if not body: return "" if encoding == "gzip": - return zlib.decompress(body, zlib.MAX_WBITS | 16) + try: + return zlib.decompress(body, zlib.MAX_WBITS | 16) + except zlib.error: + return body # assumes that the data was already decompressed else: # encoding == 'deflate' - return zlib.decompress(body) + try: + return zlib.decompress(body) + except zlib.error: + return body # assumes that the data was already decompressed # Deepcopy here in case `headers` contain objects that could # be mutated by a shallow copy and corrupt the real response.