aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/master.py
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2017-07-30 01:14:59 +0200
committerMaximilian Hils <git@maximilianhils.com>2017-07-30 01:25:36 +0200
commited1ab3f0b10aea3ea964ef61af2605685909eac9 (patch)
tree57ed9b4b1fa83995605c5a32a0c97119cfe714d9 /mitmproxy/master.py
parentb2f7995a038a5eff2e74f8326c0e8fe45155a049 (diff)
downloadmitmproxy-ed1ab3f0b10aea3ea964ef61af2605685909eac9.tar.gz
mitmproxy-ed1ab3f0b10aea3ea964ef61af2605685909eac9.tar.bz2
mitmproxy-ed1ab3f0b10aea3ea964ef61af2605685909eac9.zip
disentangle ProxyServer and Master classes.
The proxy server should ultimately be an addon itself and not be passed to the Master constructor. This commit already removes the server in the majority of instances, and also replaces a large number of ProxyConfig usages with the Options class..
Diffstat (limited to 'mitmproxy/master.py')
-rw-r--r--mitmproxy/master.py36
1 files changed, 24 insertions, 12 deletions
diff --git a/mitmproxy/master.py b/mitmproxy/master.py
index 2bc78f4b..b41e2a8d 100644
--- a/mitmproxy/master.py
+++ b/mitmproxy/master.py
@@ -10,6 +10,7 @@ from mitmproxy import exceptions
from mitmproxy import command
from mitmproxy import http
from mitmproxy import log
+from mitmproxy.net import server_spec
from mitmproxy.proxy.protocol import http_replay
from mitmproxy.types import basethread
@@ -32,16 +33,25 @@ class Master:
"""
The master handles mitmproxy's main event loop.
"""
- def __init__(self, opts, server):
- self.options = opts or options.Options()
+ def __init__(self, opts):
+ self.options = opts or options.Options() # type: options.Options
self.commands = command.CommandManager(self)
self.addons = addonmanager.AddonManager(self)
self.event_queue = queue.Queue()
self.should_exit = threading.Event()
- self.server = server
+ self._server = None
self.first_tick = True
- channel = controller.Channel(self.event_queue, self.should_exit)
- server.set_channel(channel)
+
+ @property
+ def server(self):
+ return self._server
+
+ @server.setter
+ def server(self, server):
+ server.set_channel(
+ controller.Channel(self.event_queue, self.should_exit)
+ )
+ self._server = server
@contextlib.contextmanager
def handlecontext(self):
@@ -71,7 +81,8 @@ class Master:
def start(self):
self.should_exit.clear()
- ServerThread(self.server).start()
+ if self.server:
+ ServerThread(self.server).start()
def run(self):
self.start()
@@ -101,7 +112,8 @@ class Master:
return changed
def shutdown(self):
- self.server.shutdown()
+ if self.server:
+ self.server.shutdown()
self.should_exit.set()
self.addons.trigger("done")
@@ -110,10 +122,10 @@ class Master:
Loads a flow
"""
if isinstance(f, http.HTTPFlow):
- if self.server and self.options.mode.startswith("reverse:"):
- f.request.host = self.server.config.upstream_server.address[0]
- f.request.port = self.server.config.upstream_server.address[1]
- f.request.scheme = self.server.config.upstream_server.scheme
+ if self.options.mode.startswith("reverse:"):
+ _, upstream_spec = server_spec.parse_with_mode(self.options.mode)
+ f.request.host, f.request.port = upstream_spec.address
+ f.request.scheme = upstream_spec.scheme
f.reply = controller.DummyReply()
for e, o in eventsequence.iterate(f):
self.addons.handle_lifecycle(e, o)
@@ -168,7 +180,7 @@ class Master:
f.request.headers.insert(0, "host", host)
rt = http_replay.RequestReplayThread(
- self.server.config,
+ self.options,
f,
self.event_queue,
self.should_exit