async def cycle(self, master, content): f = tflow.tflow(req=tutils.treq(content=content)) layer = mock.Mock("mitmproxy.proxy.protocol.base.Layer") layer.client_conn = f.client_conn layer.reply = controller.DummyReply() await master.addons.handle_lifecycle( server_hooks.ClientConnectedHook(layer)) for e in eventsequence.iterate(f): await master.addons.handle_lifecycle(e) await master.addons.handle_lifecycle( server_hooks.ClientDisconnectedHook(layer)) return f
async def handle_client(self) -> None: watch = asyncio_utils.create_task( self.timeout_watchdog.watch(), name="timeout watchdog", client=self.client.peername, ) if not watch: return # this should not be needed, see asyncio_utils.create_task self.log("client connect") await self.handle_hook(server_hooks.ClientConnectedHook(self.client)) if self.client.error: self.log("client kill connection") writer = self.transports.pop(self.client).writer assert writer writer.close() else: handler = asyncio_utils.create_task( self.handle_connection(self.client), name=f"client connection handler", client=self.client.peername, ) if not handler: return # this should not be needed, see asyncio_utils.create_task self.transports[self.client].handler = handler self.server_event(events.Start()) await asyncio.wait([handler]) watch.cancel() self.log("client disconnect") self.client.timestamp_end = time.time() await self.handle_hook(server_hooks.ClientDisconnectedHook(self.client) ) if self.transports: self.log("closing transports...", "debug") for io in self.transports.values(): if io.handler: asyncio_utils.cancel_task(io.handler, "client disconnected") await asyncio.wait( [x.handler for x in self.transports.values() if x.handler]) self.log("transports closed!", "debug")
async def test_all(self): opts = options.Options( mode="reverse:https://use-this-domain" ) s = State() with taddons.context(s, options=opts) as ctx: f = tflow.tflow(req=None) await ctx.master.addons.handle_lifecycle(server_hooks.ClientConnectedHook(f.client_conn)) f.request = mitmproxy.test.tutils.treq() await ctx.master.addons.handle_lifecycle(layers.http.HttpRequestHook(f)) assert len(s.flows) == 1 f.response = mitmproxy.test.tutils.tresp() await ctx.master.addons.handle_lifecycle(layers.http.HttpResponseHook(f)) assert len(s.flows) == 1 await ctx.master.addons.handle_lifecycle(server_hooks.ClientDisconnectedHook(f.client_conn)) f.error = flow.Error("msg") await ctx.master.addons.handle_lifecycle(layers.http.HttpErrorHook(f))