diff --git a/scrapy/core/downloader/handlers/datauri.py b/scrapy/core/downloader/handlers/datauri.py index a45b4ff3c..3c09dd246 100644 --- a/scrapy/core/downloader/handlers/datauri.py +++ b/scrapy/core/downloader/handlers/datauri.py @@ -1,8 +1,8 @@ from w3lib.url import parse_data_uri from scrapy.http import TextResponse -from scrapy.responsetypes import responsetypes from scrapy.utils.decorators import defers +from scrapy.utils.response import get_response_class class DataURIDownloadHandler: @@ -11,7 +11,10 @@ class DataURIDownloadHandler: @defers def download_request(self, request, spider): uri = parse_data_uri(request.url) - respcls = responsetypes.from_mimetype(uri.media_type) + respcls = get_response_class( + body=uri.data, + declared_mime_types=(uri.media_type.encode(),), + ) resp_kwargs = {} if (issubclass(respcls, TextResponse) diff --git a/scrapy/core/downloader/handlers/file.py b/scrapy/core/downloader/handlers/file.py index 0d94e3df0..ffff915fa 100644 --- a/scrapy/core/downloader/handlers/file.py +++ b/scrapy/core/downloader/handlers/file.py @@ -1,7 +1,7 @@ from w3lib.url import file_uri_to_path -from scrapy.responsetypes import responsetypes from scrapy.utils.decorators import defers +from scrapy.utils.response import get_response_class class FileDownloadHandler: @@ -12,5 +12,5 @@ class FileDownloadHandler: filepath = file_uri_to_path(request.url) with open(filepath, 'rb') as fo: body = fo.read() - respcls = responsetypes.from_args(filename=filepath, body=body) + respcls = get_response_class(url=request.url, body=body) return respcls(url=request.url, body=body) diff --git a/scrapy/core/downloader/handlers/ftp.py b/scrapy/core/downloader/handlers/ftp.py index a495874bd..397ff7b98 100644 --- a/scrapy/core/downloader/handlers/ftp.py +++ b/scrapy/core/downloader/handlers/ftp.py @@ -36,9 +36,9 @@ from twisted.internet.protocol import ClientCreator, Protocol from twisted.protocols.ftp import CommandFailed, FTPClient from scrapy.http import Response -from scrapy.responsetypes import responsetypes from scrapy.utils.httpobj import urlparse_cached from scrapy.utils.python import to_bytes +from scrapy.utils.response import get_response_class class ReceivedDataProtocol(Protocol): @@ -105,7 +105,7 @@ class FTPDownloadHandler: protocol.close() headers = {"local filename": protocol.filename or '', "size": protocol.size} body = to_bytes(protocol.filename or protocol.body.read()) - respcls = responsetypes.from_args(url=request.url, body=body) + respcls = get_response_class(url=request.url, body=body) return respcls(url=request.url, status=200, body=body, headers=headers) def _failed(self, result, request): diff --git a/scrapy/core/downloader/handlers/http11.py b/scrapy/core/downloader/handlers/http11.py index 38935667d..c40389aae 100644 --- a/scrapy/core/downloader/handlers/http11.py +++ b/scrapy/core/downloader/handlers/http11.py @@ -24,8 +24,8 @@ from scrapy.core.downloader.contextfactory import load_context_factory_from_sett from scrapy.core.downloader.webclient import _parse from scrapy.exceptions import ScrapyDeprecationWarning, StopDownload from scrapy.http import Headers -from scrapy.responsetypes import responsetypes from scrapy.utils.python import to_bytes, to_unicode +from scrapy.utils.response import get_response_class logger = logging.getLogger(__name__) @@ -449,7 +449,7 @@ class ScrapyAgent: def _cb_bodydone(self, result, request, url): headers = self._headers_from_twisted_response(result["txresponse"]) - respcls = responsetypes.from_args(headers=headers, url=url, body=result["body"]) + respcls = get_response_class(http_headers=headers, url=url, body=result["body"]) try: version = result["txresponse"].version protocol = f"{to_unicode(version[0])}/{version[1]}.{version[2]}" diff --git a/scrapy/core/downloader/webclient.py b/scrapy/core/downloader/webclient.py index 7d048c1e4..a97ef7027 100644 --- a/scrapy/core/downloader/webclient.py +++ b/scrapy/core/downloader/webclient.py @@ -9,7 +9,7 @@ from twisted.internet.protocol import ClientFactory from scrapy.http import Headers from scrapy.utils.httpobj import urlparse_cached from scrapy.utils.python import to_bytes, to_unicode -from scrapy.responsetypes import responsetypes +from scrapy.utils.response import get_response_class def _parsed_url_args(parsed): @@ -112,7 +112,7 @@ class ScrapyHTTPClientFactory(ClientFactory): request.meta['download_latency'] = self.headers_time - self.start_time status = int(self.status) headers = Headers(self.response_headers) - respcls = responsetypes.from_args(headers=headers, url=self._url, body=body) + respcls = get_response_class(http_headers=headers, url=self._url, body=body) return respcls(url=self._url, status=status, headers=headers, body=body, protocol=to_unicode(self.version)) def _set_connection_attributes(self, request): diff --git a/scrapy/core/http2/stream.py b/scrapy/core/http2/stream.py index 5c393c027..a36c8c36c 100644 --- a/scrapy/core/http2/stream.py +++ b/scrapy/core/http2/stream.py @@ -14,7 +14,7 @@ from twisted.web.client import ResponseFailed from scrapy.http import Request from scrapy.http.headers import Headers -from scrapy.responsetypes import responsetypes +from scrapy.utils.response import get_response_class if TYPE_CHECKING: from scrapy.core.http2.protocol import H2ClientProtocol @@ -450,8 +450,8 @@ class Stream: generated response instance""" body = self._response['body'].getvalue() - response_cls = responsetypes.from_args( - headers=self._response['headers'], + response_cls = get_response_class( + http_headers=self._response['headers'], url=self._request.url, body=body, ) diff --git a/scrapy/downloadermiddlewares/decompression.py b/scrapy/downloadermiddlewares/decompression.py index 0fcf8fb8c..389755d12 100644 --- a/scrapy/downloadermiddlewares/decompression.py +++ b/scrapy/downloadermiddlewares/decompression.py @@ -10,7 +10,7 @@ import zipfile from io import BytesIO from tempfile import mktemp -from scrapy.responsetypes import responsetypes +from scrapy.utils.response import get_response_class logger = logging.getLogger(__name__) @@ -36,7 +36,7 @@ class DecompressionMiddleware: return body = tar_file.extractfile(tar_file.members[0]).read() - respcls = responsetypes.from_args(filename=tar_file.members[0].name, body=body) + respcls = get_response_class(url=tar_file.members[0].name, body=body) return response.replace(body=body, cls=respcls) def _is_zip(self, response): @@ -48,7 +48,7 @@ class DecompressionMiddleware: namelist = zip_file.namelist() body = zip_file.read(namelist[0]) - respcls = responsetypes.from_args(filename=namelist[0], body=body) + respcls = get_response_class(url=namelist[0], body=body) return response.replace(body=body, cls=respcls) def _is_gzip(self, response): @@ -58,7 +58,7 @@ class DecompressionMiddleware: except IOError: return - respcls = responsetypes.from_args(body=body) + respcls = get_response_class(body=body) return response.replace(body=body, cls=respcls) def _is_bzip2(self, response): @@ -67,7 +67,7 @@ class DecompressionMiddleware: except IOError: return - respcls = responsetypes.from_args(body=body) + respcls = get_response_class(body=body) return response.replace(body=body, cls=respcls) def process_response(self, request, response, spider): diff --git a/scrapy/downloadermiddlewares/httpcompression.py b/scrapy/downloadermiddlewares/httpcompression.py index 4e7feeeaf..11407ca46 100644 --- a/scrapy/downloadermiddlewares/httpcompression.py +++ b/scrapy/downloadermiddlewares/httpcompression.py @@ -4,9 +4,9 @@ import zlib from scrapy.exceptions import NotConfigured from scrapy.http import Response, TextResponse -from scrapy.responsetypes import responsetypes from scrapy.utils.deprecate import ScrapyDeprecationWarning from scrapy.utils.gz import gunzip +from scrapy.utils.response import get_response_class ACCEPTED_ENCODINGS = [b'gzip', b'deflate'] @@ -63,8 +63,10 @@ class HttpCompressionMiddleware: if self.stats: 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 + respcls = get_response_class( + http_headers=response.headers, + url=response.url, + body=decoded_body, ) kwargs = dict(cls=respcls, body=decoded_body) if issubclass(respcls, TextResponse): diff --git a/scrapy/extensions/httpcache.py b/scrapy/extensions/httpcache.py index 843e14812..a5fe87232 100644 --- a/scrapy/extensions/httpcache.py +++ b/scrapy/extensions/httpcache.py @@ -10,10 +10,10 @@ from weakref import WeakKeyDictionary from w3lib.http import headers_raw_to_dict, headers_dict_to_raw from scrapy.http import Headers, Response -from scrapy.responsetypes import responsetypes from scrapy.utils.httpobj import urlparse_cached from scrapy.utils.project import data_path from scrapy.utils.python import to_bytes, to_unicode +from scrapy.utils.response import get_response_class logger = logging.getLogger(__name__) @@ -240,7 +240,7 @@ class DbmCacheStorage: status = data['status'] headers = Headers(data['headers']) body = data['body'] - respcls = responsetypes.from_args(headers=headers, url=url, body=body) + respcls = get_response_class(http_headers=headers, url=url, body=body) response = respcls(url=url, headers=headers, status=status, body=body) return response @@ -299,7 +299,7 @@ class FilesystemCacheStorage: url = metadata.get('response_url') status = metadata['status'] headers = Headers(headers_raw_to_dict(rawheaders)) - respcls = responsetypes.from_args(headers=headers, url=url, body=body) + respcls = get_response_class(http_headers=headers, url=url, body=body) response = respcls(url=url, headers=headers, status=status, body=body) return response diff --git a/scrapy/http/request/form.py b/scrapy/http/request/form.py index 0c947565a..77341962f 100644 --- a/scrapy/http/request/form.py +++ b/scrapy/http/request/form.py @@ -15,7 +15,6 @@ from w3lib.html import strip_html5_whitespace from scrapy.http.request import Request from scrapy.http.response.text import TextResponse from scrapy.utils.python import to_bytes, is_listlike -from scrapy.utils.response import get_base_url FormRequestTypeVar = TypeVar("FormRequestTypeVar", bound="FormRequest") @@ -98,7 +97,7 @@ def _get_form( formxpath: Optional[str], ) -> FormElement: """Find the wanted form element within the given response.""" - root = create_root_node(response.text, HTMLParser, base_url=get_base_url(response)) + root = create_root_node(response.text, HTMLParser, base_url=response.base_url) forms = root.xpath('//form') if not forms: raise ValueError(f"No