(
self,
reader: asyncio.StreamReader | mitmproxy_rs.Stream,
writer: asyncio.StreamWriter | mitmproxy_rs.Stream | None = None,
)
| 183 | } |
| 184 | |
| 185 | async def handle_stream( |
| 186 | self, |
| 187 | reader: asyncio.StreamReader | mitmproxy_rs.Stream, |
| 188 | writer: asyncio.StreamWriter | mitmproxy_rs.Stream | None = None, |
| 189 | ) -> None: |
| 190 | if writer is None: |
| 191 | assert isinstance(reader, mitmproxy_rs.Stream) |
| 192 | writer = reader |
| 193 | handler = ProxyConnectionHandler( |
| 194 | ctx.master, reader, writer, ctx.options, self.mode |
| 195 | ) |
| 196 | handler.layer = self.make_top_layer(handler.layer.context) |
| 197 | if isinstance(self.mode, mode_specs.TransparentMode): |
| 198 | assert isinstance(writer, asyncio.StreamWriter) |
| 199 | s = cast(socket.socket, writer.get_extra_info("socket")) |
| 200 | try: |
| 201 | assert platform.original_addr |
| 202 | original_dst = platform.original_addr(s) |
| 203 | except Exception as e: |
| 204 | logger.error(f"Transparent mode failure: {e!r}") |
| 205 | writer.close() |
| 206 | return |
| 207 | else: |
| 208 | handler.layer.context.client.sockname = original_dst |
| 209 | handler.layer.context.server.address = original_dst |
| 210 | elif isinstance( |
| 211 | self.mode, |
| 212 | (mode_specs.WireGuardMode, mode_specs.LocalMode, mode_specs.TunMode), |
| 213 | ): # pragma: no cover on platforms without wg-test-client |
| 214 | handler.layer.context.server.address = writer.get_extra_info( |
| 215 | "remote_endpoint", handler.layer.context.client.sockname |
| 216 | ) |
| 217 | |
| 218 | with self.manager.register_connection(handler.layer.context.client.id, handler): |
| 219 | await handler.handle_client() |
| 220 | |
| 221 | |
| 222 | class AsyncioServerInstance(ServerInstance[M], metaclass=ABCMeta): |
no test coverage detected