From 50e5897429cd3a5b12c1aa0de6db8ab4dac656d4 Mon Sep 17 00:00:00 2001 From: Andrey Rakhmatullin Date: Mon, 30 Dec 2024 19:30:31 +0500 Subject: [PATCH] Fix merge errors and other simple mistakes. --- .../downloadermiddlewares/httpcompression.py | 35 ++-- ...st_downloadermiddleware_httpcompression.py | 161 ++++++++++-------- 2 files changed, 101 insertions(+), 95 deletions(-) diff --git a/scrapy/downloadermiddlewares/httpcompression.py b/scrapy/downloadermiddlewares/httpcompression.py index dfdad9864..95d5dba66 100644 --- a/scrapy/downloadermiddlewares/httpcompression.py +++ b/scrapy/downloadermiddlewares/httpcompression.py @@ -1,12 +1,13 @@ from __future__ import annotations import io +import warnings import zlib from typing import TYPE_CHECKING, List, Optional, Union from scrapy import Request, Spider from scrapy.crawler import Crawler -from scrapy.exceptions import NotConfigured +from scrapy.exceptions import NotConfigured, ScrapyDeprecationWarning from scrapy.http import Response, TextResponse from scrapy.responsetypes import responsetypes from scrapy.statscollectors import StatsCollector @@ -37,20 +38,12 @@ class HttpCompressionMiddleware: """This middleware allows compressed (gzip, deflate) traffic to be sent/received from web sites""" - def __init__(self, stats: Optional[StatsCollector] = None): + def __init__(self, stats: Optional[StatsCollector] = None, settings=None): self.stats = stats - if not stats: - warnings.warn( - "The default value of COMPRESSION_KEEP_ENCODING_HEADER, " - "False, is deprecated, and will stop working and stop " - "being its default value in a future version of Scrapy. " - "Set COMPRESSION_KEEP_ENCODING_HEADER=True in your " - "settings to remove this warning.", - ScrapyDeprecationWarning, - stacklevel=2, - ) if settings: - self.keep_encoding_header = settings.getbool('COMPRESSION_KEEP_ENCODING_HEADER') + self.keep_encoding_header = settings.getbool( + "COMPRESSION_KEEP_ENCODING_HEADER" + ) if not self.keep_encoding_header: warnings.warn( "Setting COMPRESSION_KEEP_ENCODING_HEADER=False is deprecated", @@ -97,17 +90,19 @@ class HttpCompressionMiddleware: ) -> Union[Request, Response]: if request.method == "HEAD": return response - if b'decoded' in response.flags: + if b"decoded" in response.flags: return response - content_encoding = response.headers.getlist('Content-Encoding') + content_encoding = response.headers.getlist("Content-Encoding") if not content_encoding: return response encoding = content_encoding[0] decoded_body = self._decode(response.body, encoding.lower()) if self.stats: - self.stats.inc_value('httpcompression/response_bytes', len(decoded_body), spider=spider) - self.stats.inc_value('httpcompression/response_count', spider=spider) + self.stats.inc_value( + "httpcompression/response_bytes", len(decoded_body), spider=spider + ) + self.stats.inc_value("httpcompression/response_count", spider=spider) respcls = responsetypes.from_args( headers=response.headers, url=response.url, body=decoded_body ) @@ -115,12 +110,12 @@ class HttpCompressionMiddleware: if issubclass(respcls, TextResponse): # force recalculating the encoding until we make sure the # responsetypes guessing is reliable - kwargs['encoding'] = None + kwargs["encoding"] = None - kwargs['flags'] = response.flags + [b'decoded'] + kwargs["flags"] = response.flags + [b"decoded"] response = response.replace(**kwargs) if not self.keep_encoding_header: - del response.headers['Content-Encoding'] + del response.headers["Content-Encoding"] return response def _decode(self, body: bytes, encoding: bytes) -> bytes: diff --git a/tests/test_downloadermiddleware_httpcompression.py b/tests/test_downloadermiddleware_httpcompression.py index 0c4fff629..b52882795 100644 --- a/tests/test_downloadermiddleware_httpcompression.py +++ b/tests/test_downloadermiddleware_httpcompression.py @@ -2,6 +2,7 @@ from gzip import GzipFile from io import BytesIO from pathlib import Path from unittest import SkipTest, TestCase +from warnings import catch_warnings from w3lib.encoding import resolve_encoding @@ -9,7 +10,7 @@ from scrapy.downloadermiddlewares.httpcompression import ( ACCEPTED_ENCODINGS, HttpCompressionMiddleware, ) -from scrapy.exceptions import NotConfigured +from scrapy.exceptions import NotConfigured, ScrapyDeprecationWarning from scrapy.http import HtmlResponse, Request, Response from scrapy.responsetypes import responsetypes from scrapy.settings import Settings @@ -110,14 +111,16 @@ class HttpCompressionTest(TestCase): self.assertEqual(response.headers["Content-Encoding"], b"gzip") newresponse = self.mw.process_response(request, response, self.spider) self.assertNotEqual(newresponse, response) - self.assertTrue(newresponse.body.startswith(b'