diff options
Diffstat (limited to 'libmproxy/flow.py')
-rw-r--r-- | libmproxy/flow.py | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 44dc57ae..59d8bde4 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -6,7 +6,7 @@ import hashlib, Cookie, cookielib, copy, re, urlparse, os, threading import time, urllib import tnetstring, filt, script, utils, encoding, proxy from email.utils import parsedate_tz, formatdate, mktime_tz -from netlib import odict, http, certutils +from netlib import odict, http, certutils, wsgi import controller, version import app @@ -17,6 +17,28 @@ ODict = odict.ODict ODictCaseless = odict.ODictCaseless +class AppRegistry: + def __init__(self): + self.apps = {} + + def add(self, app, domain, port): + """ + Add a WSGI app to the registry, to be served for requests to the + specified domain, on the specified port. + """ + self.apps[(domain, port)] = wsgi.WSGIAdaptor(app, domain, port, version.NAMEVERSION) + + def get(self, request): + """ + Returns an WSGIAdaptor instance if request matches an app, or None. + """ + if (request.host, request.port) in self.apps: + return self.apps[(request.host, request.port)] + if "host" in request.headers: + host = request.headers["host"][0] + return self.apps.get((host, request.port), None) + + class ReplaceHooks: def __init__(self): self.lst = [] @@ -289,8 +311,10 @@ class Request(HTTPMsg): """ def __init__( - self, client_conn, httpversion, host, port, scheme, method, path, headers, content, timestamp_start=None, - timestamp_end=None, tcp_setup_timestamp=None, ssl_setup_timestamp=None, ip=None): + self, client_conn, httpversion, host, port, + scheme, method, path, headers, content, timestamp_start=None, + timestamp_end=None, tcp_setup_timestamp=None, + ssl_setup_timestamp=None, ip=None): assert isinstance(headers, ODictCaseless) self.client_conn = client_conn self.httpversion = httpversion @@ -1374,16 +1398,16 @@ class FlowMaster(controller.Master): self.stream = None app.mapp.config["PMASTER"] = self + self.apps = AppRegistry() def start_app(self, host, port, external): if not external: - self.server.apps.add( + self.apps.add( app.mapp, host, port ) else: - print host threading.Thread(target=app.mapp.run,kwargs={ "use_reloader": False, "host": host, @@ -1590,9 +1614,11 @@ class FlowMaster(controller.Master): r.reply() def handle_serverconnection(self, sc): - # To unify the mitmproxy script API, we call the script hook "serverconnect" rather than "serverconnection". - # As things are handled differently in libmproxy (ClientConnect + ClientDisconnect vs ServerConnection class), - # there is no "serverdisonnect" event at the moment. + # To unify the mitmproxy script API, we call the script hook + # "serverconnect" rather than "serverconnection". As things are handled + # differently in libmproxy (ClientConnect + ClientDisconnect vs + # ServerConnection class), there is no "serverdisonnect" event at the + # moment. self.run_script_hook("serverconnect", sc) sc.reply() @@ -1606,12 +1632,19 @@ class FlowMaster(controller.Master): return f def handle_request(self, r): - f = self.state.add_request(r) - self.replacehooks.run(f) - self.setheaders.run(f) - self.run_script_hook("request", f) - self.process_new_request(f) - return f + app = self.apps.get(r) + if app: + r.reply() + #err = app.serve(r, self.wfile) + #if err: + # self.add_event("Error in wsgi app. %s"%err, "error") + else: + f = self.state.add_request(r) + self.replacehooks.run(f) + self.setheaders.run(f) + self.run_script_hook("request", f) + self.process_new_request(f) + return f def handle_response(self, r): f = self.state.add_response(r) |