Handle a client connection
(
self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter
)
| 93 | return False |
| 94 | |
| 95 | async def handle_client( |
| 96 | self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter |
| 97 | ): |
| 98 | """ |
| 99 | Handle a client connection |
| 100 | """ |
| 101 | current_task = asyncio.current_task() |
| 102 | if current_task: |
| 103 | self.background_tasks.add(current_task) |
| 104 | current_task.add_done_callback(self.background_tasks.discard) |
| 105 | |
| 106 | try: |
| 107 | request_line = await reader.readline() |
| 108 | request_line = request_line.decode("utf-8").strip() |
| 109 | |
| 110 | if not request_line: |
| 111 | self._safe_close(writer) |
| 112 | return |
| 113 | |
| 114 | parts = request_line.split(" ") |
| 115 | if len(parts) < 2: |
| 116 | self._safe_close(writer) |
| 117 | return |
| 118 | method, target = parts[0], parts[1] |
| 119 | |
| 120 | if method == "CONNECT": |
| 121 | await self._handle_connect(reader, writer, target) |
| 122 | |
| 123 | except asyncio.CancelledError: |
| 124 | raise |
| 125 | except Exception as e: |
| 126 | self.logger.error(f"Error handling client: {e}", exc_info=True) |
| 127 | finally: |
| 128 | self._safe_close(writer) |
| 129 | |
| 130 | async def _handle_connect( |
| 131 | self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter, target: str |