async def test_asgi_full(): ps = Proxyserver() addons = [ asgiapp.WSGIApp(tapp, "testapp", 80), asgiapp.ASGIApp(errapp, "errapp", 80), asgiapp.ASGIApp(noresponseapp, "noresponseapp", 80), ] with taddons.context(ps, *addons) as tctx: tctx.master.addons.add(next_layer.NextLayer()) tctx.configure(ps, listen_host="127.0.0.1", listen_port=0) ps.running() await tctx.master.await_log("Proxy server listening", level="info") proxy_addr = ps.server.sockets[0].getsockname()[:2] reader, writer = await asyncio.open_connection(*proxy_addr) req = f"GET http://testapp:80/ HTTP/1.1\r\n\r\n" writer.write(req.encode()) header = await reader.readuntil(b"\r\n\r\n") assert header.startswith(b"HTTP/1.1 200 OK") body = await reader.readuntil(b"testapp") assert body == b"testapp" reader, writer = await asyncio.open_connection(*proxy_addr) req = f"GET http://testapp:80/parameters?param1=1¶m2=2 HTTP/1.1\r\n\r\n" writer.write(req.encode()) header = await reader.readuntil(b"\r\n\r\n") assert header.startswith(b"HTTP/1.1 200 OK") body = await reader.readuntil(b"}") assert body == b'{"param1": "1", "param2": "2"}' reader, writer = await asyncio.open_connection(*proxy_addr) req = f"POST http://testapp:80/requestbody HTTP/1.1\r\nContent-Length: 6\r\n\r\nHello!" writer.write(req.encode()) header = await reader.readuntil(b"\r\n\r\n") assert header.startswith(b"HTTP/1.1 200 OK") body = await reader.readuntil(b"}") assert body == b'{"body": "Hello!"}' reader, writer = await asyncio.open_connection(*proxy_addr) req = f"GET http://errapp:80/?foo=bar HTTP/1.1\r\n\r\n" writer.write(req.encode()) header = await reader.readuntil(b"\r\n\r\n") assert header.startswith(b"HTTP/1.1 500") body = await reader.readuntil(b"ASGI Error") assert body == b"ASGI Error" reader, writer = await asyncio.open_connection(*proxy_addr) req = f"GET http://noresponseapp:80/ HTTP/1.1\r\n\r\n" writer.write(req.encode()) header = await reader.readuntil(b"\r\n\r\n") assert header.startswith(b"HTTP/1.1 500") body = await reader.readuntil(b"ASGI Error") assert body == b"ASGI Error"
def __init__(self): threading.Thread.__init__(self) opts = options.Options(listen_host='127.0.0.1', listen_port=8080) opts.add_option("body_size_limit", int, 0, "") pconf = proxy.config.ProxyConfig(opts) self.m = DumpMaster(None, with_termlog=False, with_dumper=False) self.m.server = proxy.server.ProxyServer(pconf) if self.m.server.channel.loop.is_closed(): self.m.server.channel.loop = asyncio.new_event_loop() self.m.addons.add(Github_Proxy()) self.m.addons.add(wsgiapp.WSGIApp(app, "gitty.local", 443))
def addons(self): return [ asgiapp.WSGIApp(tapp, "testapp", 80), asgiapp.ASGIApp(errapp, "errapp", 80), asgiapp.ASGIApp(noresponseapp, "noresponseapp", 80), ]
""" Host a WSGI app in mitmproxy. This example shows how to graft a WSGI app onto mitmproxy. In this instance, we're using the Flask framework (http://flask.pocoo.org/) to expose a single simplest-possible page. """ from flask import Flask from mitmproxy.addons import asgiapp app = Flask("proxapp") @app.route('/') def hello_world() -> str: return 'Hello World!' addons = [ # Host app at the magic domain "example.com" on port 80. Requests to this # domain and port combination will now be routed to the WSGI app instance. asgiapp.WSGIApp(app, "example.com", 80) # SSL works too, but the magic domain needs to be resolvable from the mitmproxy machine due to mitmproxy's design. # mitmproxy will connect to said domain and use serve its certificate (unless --no-upstream-cert is set) # but won't send any data. # mitmproxy.ctx.master.apps.add(app, "example.com", 443) ]