| 615 | |
| 616 | |
| 617 | class _ResponseReader(Protocol): |
| 618 | def __init__( |
| 619 | self, |
| 620 | finished: Deferred[_ResultT], |
| 621 | txresponse: TxResponse, |
| 622 | request: Request, |
| 623 | maxsize: int, |
| 624 | warnsize: int, |
| 625 | fail_on_dataloss: bool, |
| 626 | crawler: Crawler, |
| 627 | *, |
| 628 | tls_verbose_logging: bool = False, |
| 629 | ): |
| 630 | self._finished: Deferred[_ResultT] = finished |
| 631 | self._txresponse: TxResponse = txresponse |
| 632 | self._request: Request = request |
| 633 | self._bodybuf: BytesIO = BytesIO() |
| 634 | self._maxsize: int = maxsize |
| 635 | self._warnsize: int = warnsize |
| 636 | self._fail_on_dataloss: bool = fail_on_dataloss |
| 637 | self._reached_warnsize: bool = False |
| 638 | self._bytes_received: int = 0 |
| 639 | self._certificate: ssl.Certificate | None = None |
| 640 | self._ip_address: ipaddress.IPv4Address | ipaddress.IPv6Address | None = None |
| 641 | self._crawler: Crawler = crawler |
| 642 | self._tls_verbose_logging: bool = tls_verbose_logging |
| 643 | |
| 644 | def _finish_response( |
| 645 | self, flags: list[str] | None = None, stop_download: StopDownload | None = None |
| 646 | ) -> None: |
| 647 | self._finished.callback( |
| 648 | { |
| 649 | "txresponse": self._txresponse, |
| 650 | "body": self._bodybuf.getvalue(), |
| 651 | "flags": flags, |
| 652 | "certificate": self._certificate, |
| 653 | "ip_address": self._ip_address, |
| 654 | "stop_download": stop_download, |
| 655 | } |
| 656 | ) |
| 657 | |
| 658 | def connectionMade(self) -> None: |
| 659 | assert self.transport |
| 660 | if self._certificate is None: |
| 661 | with suppress(AttributeError): |
| 662 | self._certificate = ssl.Certificate( |
| 663 | self.transport._producer.getPeerCertificate() |
| 664 | ) |
| 665 | |
| 666 | if self._ip_address is None: |
| 667 | self._ip_address = ipaddress.ip_address( |
| 668 | self.transport._producer.getPeer().host |
| 669 | ) |
| 670 | |
| 671 | if self._tls_verbose_logging: |
| 672 | connection = self.transport._producer.getHandle() |
| 673 | hostname = urlparse_cached(self._request).hostname |
| 674 | assert hostname is not None |