| 723 | |
| 724 | |
| 725 | class HTTPProxyConnection(asyncio.Protocol): |
| 726 | def __init__( |
| 727 | self, |
| 728 | ws_uri: WebSocketURI, |
| 729 | proxy: Proxy, |
| 730 | user_agent_header: str | None = None, |
| 731 | ): |
| 732 | self.ws_uri = ws_uri |
| 733 | self.proxy = proxy |
| 734 | self.user_agent_header = user_agent_header |
| 735 | |
| 736 | self.reader = StreamReader() |
| 737 | self.parser = Response.parse( |
| 738 | self.reader.read_line, |
| 739 | self.reader.read_exact, |
| 740 | self.reader.read_to_eof, |
| 741 | proxy=True, |
| 742 | ) |
| 743 | |
| 744 | loop = asyncio.get_running_loop() |
| 745 | self.response: asyncio.Future[Response] = loop.create_future() |
| 746 | |
| 747 | def run_parser(self) -> None: |
| 748 | try: |
| 749 | next(self.parser) |
| 750 | except StopIteration as exc: |
| 751 | response = exc.value |
| 752 | if 200 <= response.status_code < 300: |
| 753 | self.response.set_result(response) |
| 754 | else: |
| 755 | self.response.set_exception(InvalidProxyStatus(response)) |
| 756 | except Exception as exc: |
| 757 | proxy_exc = InvalidProxyMessage( |
| 758 | "did not receive a valid HTTP response from proxy" |
| 759 | ) |
| 760 | proxy_exc.__cause__ = exc |
| 761 | self.response.set_exception(proxy_exc) |
| 762 | |
| 763 | def connection_made(self, transport: asyncio.BaseTransport) -> None: |
| 764 | transport = cast(asyncio.Transport, transport) |
| 765 | self.transport = transport |
| 766 | self.transport.write( |
| 767 | prepare_connect_request(self.proxy, self.ws_uri, self.user_agent_header) |
| 768 | ) |
| 769 | |
| 770 | def data_received(self, data: bytes) -> None: |
| 771 | self.reader.feed_data(data) |
| 772 | self.run_parser() |
| 773 | |
| 774 | def eof_received(self) -> None: |
| 775 | self.reader.feed_eof() |
| 776 | self.run_parser() |
| 777 | |
| 778 | def connection_lost(self, exc: Exception | None) -> None: |
| 779 | self.reader.feed_eof() |
| 780 | if exc is not None: |
| 781 | self.response.set_exception(exc) |
| 782 |
no outgoing calls
no test coverage detected
searching dependent graphs…