aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/controller.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2016-10-19 13:22:50 +1300
committerAldo Cortesi <aldo@nullcube.com>2016-10-19 13:22:50 +1300
commitbce387a5a0d52f682f479b11cb40ae0918e070c0 (patch)
tree4b96065dc5f7c7e904a731002a184ae890de4802 /mitmproxy/controller.py
parent264a09e7789500673282075b2f5b9956268f0cea (diff)
downloadmitmproxy-bce387a5a0d52f682f479b11cb40ae0918e070c0.tar.gz
mitmproxy-bce387a5a0d52f682f479b11cb40ae0918e070c0.tar.bz2
mitmproxy-bce387a5a0d52f682f479b11cb40ae0918e070c0.zip
Kill flow.master - create master.Master
Also extract events into .events
Diffstat (limited to 'mitmproxy/controller.py')
-rw-r--r--mitmproxy/controller.py136
1 files changed, 1 insertions, 135 deletions
diff --git a/mitmproxy/controller.py b/mitmproxy/controller.py
index a88500a8..27fb4a0c 100644
--- a/mitmproxy/controller.py
+++ b/mitmproxy/controller.py
@@ -1,45 +1,6 @@
import functools
-import threading
-import contextlib
import queue
-
-from mitmproxy import addons
-from mitmproxy import options
-from . import ctx as mitmproxy_ctx
-from netlib import basethread
-from . import exceptions
-
-
-Events = frozenset([
- "clientconnect",
- "clientdisconnect",
- "serverconnect",
- "serverdisconnect",
-
- "tcp_start",
- "tcp_message",
- "tcp_error",
- "tcp_end",
-
- "request",
- "requestheaders",
- "response",
- "responseheaders",
- "error",
-
- "intercept",
- "resume",
-
- "websocket_handshake",
-
- "next_layer",
-
- "configure",
- "done",
- "log",
- "start",
- "tick",
-])
+from mitmproxy import exceptions
class LogEntry:
@@ -83,101 +44,6 @@ class Log:
self.master.add_log(text, level)
-class Master:
- """
- The master handles mitmproxy's main event loop.
- """
- def __init__(self, opts, server):
- self.options = opts or options.Options()
- self.addons = addons.Addons(self)
- self.event_queue = queue.Queue()
- self.should_exit = threading.Event()
- self.server = server
- channel = Channel(self.event_queue, self.should_exit)
- server.set_channel(channel)
-
- @contextlib.contextmanager
- def handlecontext(self):
- # Handlecontexts also have to nest - leave cleanup to the outermost
- if mitmproxy_ctx.master:
- yield
- return
- mitmproxy_ctx.master = self
- mitmproxy_ctx.log = Log(self)
- try:
- yield
- finally:
- mitmproxy_ctx.master = None
- mitmproxy_ctx.log = None
-
- def tell(self, mtype, m):
- m.reply = DummyReply()
- self.event_queue.put((mtype, m))
-
- def add_log(self, e, level):
- """
- level: debug, info, warn, error
- """
- with self.handlecontext():
- self.addons("log", LogEntry(e, level))
-
- def start(self):
- self.should_exit.clear()
- ServerThread(self.server).start()
-
- def run(self):
- self.start()
- try:
- while not self.should_exit.is_set():
- # Don't choose a very small timeout in Python 2:
- # https://github.com/mitmproxy/mitmproxy/issues/443
- # TODO: Lower the timeout value if we move to Python 3.
- self.tick(0.1)
- finally:
- self.shutdown()
-
- def tick(self, timeout):
- with self.handlecontext():
- self.addons("tick")
- changed = False
- try:
- mtype, obj = self.event_queue.get(timeout=timeout)
- if mtype not in Events:
- raise exceptions.ControlException("Unknown event %s" % repr(mtype))
- handle_func = getattr(self, mtype)
- if not callable(handle_func):
- raise exceptions.ControlException("Handler %s not callable" % mtype)
- if not handle_func.__dict__.get("__handler"):
- raise exceptions.ControlException(
- "Handler function %s is not decorated with controller.handler" % (
- handle_func
- )
- )
- handle_func(obj)
- self.event_queue.task_done()
- changed = True
- except queue.Empty:
- pass
- return changed
-
- def shutdown(self):
- self.server.shutdown()
- self.should_exit.set()
- self.addons.done()
-
-
-class ServerThread(basethread.BaseThread):
- def __init__(self, server):
- self.server = server
- address = getattr(self.server, "address", None)
- super().__init__(
- "ServerThread ({})".format(repr(address))
- )
-
- def run(self):
- self.server.serve_forever()
-
-
class Channel:
"""
The only way for the proxy server to communicate with the master