(self, target: str, reader, writer)
| 542 | # ── CONNECT (HTTPS tunnelling) ──────────────────────────────── |
| 543 | |
| 544 | async def _do_connect(self, target: str, reader, writer): |
| 545 | host, _, port_str = target.rpartition(":") |
| 546 | try: |
| 547 | port = int(port_str) if port_str else 443 |
| 548 | except ValueError: |
| 549 | log.warning("CONNECT invalid target: %r", target) |
| 550 | writer.write(b"HTTP/1.1 400 Bad Request\r\n\r\n") |
| 551 | await writer.drain() |
| 552 | return |
| 553 | if not host: |
| 554 | host, port = target, 443 |
| 555 | |
| 556 | log.info("CONNECT → %s:%d", host, port) |
| 557 | |
| 558 | writer.write(b"HTTP/1.1 200 Connection Established\r\n\r\n") |
| 559 | await writer.drain() |
| 560 | |
| 561 | await self._handle_target_tunnel(host, port, reader, writer) |
| 562 | |
| 563 | async def _handle_target_tunnel(self, host: str, port: int, |
| 564 | reader: asyncio.StreamReader, |
no test coverage detected