aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mitmproxy/master.py36
-rw-r--r--mitmproxy/proxy/config.py11
-rw-r--r--mitmproxy/proxy/protocol/http_replay.py31
-rw-r--r--mitmproxy/test/taddons.py10
-rw-r--r--mitmproxy/tools/console/master.py13
-rw-r--r--mitmproxy/tools/console/statusbar.py8
-rw-r--r--mitmproxy/tools/dump.py3
-rw-r--r--mitmproxy/tools/main.py3
-rw-r--r--mitmproxy/tools/web/master.py6
-rw-r--r--test/filename_matching.py2
-rw-r--r--test/mitmproxy/addons/test_termstatus.py2
-rw-r--r--test/mitmproxy/proxy/protocol/test_http2.py17
-rw-r--r--test/mitmproxy/proxy/protocol/test_websocket.py7
-rw-r--r--test/mitmproxy/proxy/test_server.py37
-rw-r--r--test/mitmproxy/test_addonmanager.py9
-rw-r--r--test/mitmproxy/test_controller.py3
-rw-r--r--test/mitmproxy/test_flow.py10
-rw-r--r--test/mitmproxy/tools/console/test_master.py3
-rw-r--r--test/mitmproxy/tools/console/test_statusbar.py4
-rw-r--r--test/mitmproxy/tools/test_dump.py7
-rw-r--r--test/mitmproxy/tools/web/test_app.py3
-rw-r--r--test/mitmproxy/tools/web/test_master.py5
-rw-r--r--test/mitmproxy/tservers.py21
23 files changed, 130 insertions, 121 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
diff --git a/mitmproxy/proxy/config.py b/mitmproxy/proxy/config.py
index b809d89a..9458cd42 100644
--- a/mitmproxy/proxy/config.py
+++ b/mitmproxy/proxy/config.py
@@ -1,6 +1,6 @@
import os
import re
-from typing import Any
+import typing
from OpenSSL import SSL, crypto
@@ -42,10 +42,11 @@ class ProxyConfig:
self.certstore = None # type: certs.CertStore
self.client_certs = None # type: str
self.openssl_verification_mode_server = None # type: int
+ self.upstream_server = None # type: typing.Optional[server_spec.ServerSpec]
self.configure(options, set(options.keys()))
options.changed.connect(self.configure)
- def configure(self, options: moptions.Options, updated: Any) -> None:
+ def configure(self, options: moptions.Options, updated: typing.Any) -> None:
if options.add_upstream_certs_to_client_chain and not options.ssl_insecure:
raise exceptions.OptionsError(
"The verify-upstream-cert requires certificate verification to be disabled. "
@@ -58,8 +59,10 @@ class ProxyConfig:
else:
self.openssl_verification_mode_server = SSL.VERIFY_PEER
- self.check_ignore = HostMatcher(options.ignore_hosts)
- self.check_tcp = HostMatcher(options.tcp_hosts)
+ if "ignore_hosts" in updated:
+ self.check_ignore = HostMatcher(options.ignore_hosts)
+ if "tcp_hosts" in updated:
+ self.check_tcp = HostMatcher(options.tcp_hosts)
self.openssl_method_client, self.openssl_options_client = \
tcp.sslversion_choices[options.ssl_version_client]
diff --git a/mitmproxy/proxy/protocol/http_replay.py b/mitmproxy/proxy/protocol/http_replay.py
index 1aa91847..915c71c4 100644
--- a/mitmproxy/proxy/protocol/http_replay.py
+++ b/mitmproxy/proxy/protocol/http_replay.py
@@ -1,9 +1,15 @@
+import queue
+import threading
+import typing
+
from mitmproxy import log
from mitmproxy import controller
from mitmproxy import exceptions
from mitmproxy import http
from mitmproxy import flow
+from mitmproxy import options
from mitmproxy import connections
+from mitmproxy.net import server_spec
from mitmproxy.net.http import http1
from mitmproxy.types import basethread
@@ -14,12 +20,19 @@ from mitmproxy.types import basethread
class RequestReplayThread(basethread.BaseThread):
name = "RequestReplayThread"
- def __init__(self, config, f, event_queue, should_exit):
+ def __init__(
+ self,
+ opts: options.Options,
+ f: http.HTTPFlow,
+ event_queue: typing.Optional[queue.Queue],
+ should_exit: threading.Event
+ ) -> None:
"""
event_queue can be a queue or None, if no scripthooks should be
processed.
"""
- self.config, self.f = config, f
+ self.options = opts
+ self.f = f
f.live = True
if event_queue:
self.channel = controller.Channel(event_queue, should_exit)
@@ -31,7 +44,7 @@ class RequestReplayThread(basethread.BaseThread):
def run(self):
r = self.f.request
- bsl = self.config.options._processed.get("body_size_limit")
+ bsl = self.options._processed.get("body_size_limit")
first_line_format_backup = r.first_line_format
server = None
try:
@@ -45,9 +58,9 @@ class RequestReplayThread(basethread.BaseThread):
if not self.f.response:
# In all modes, we directly connect to the server displayed
- if self.config.options.mode.startswith("upstream:"):
- server_address = self.config.upstream_server.address
- server = connections.ServerConnection(server_address, (self.config.options.listen_host, 0))
+ if self.options.mode.startswith("upstream:"):
+ server_address = server_spec.parse_with_mode(self.options.mode)[1].address
+ server = connections.ServerConnection(server_address, (self.options.listen_host, 0))
server.connect()
if r.scheme == "https":
connect_request = http.make_connect_request((r.data.host, r.port))
@@ -61,7 +74,7 @@ class RequestReplayThread(basethread.BaseThread):
if resp.status_code != 200:
raise exceptions.ReplayException("Upstream server refuses CONNECT request")
server.establish_ssl(
- self.config.client_certs,
+ self.options.client_certs,
sni=self.f.server_conn.sni
)
r.first_line_format = "relative"
@@ -71,12 +84,12 @@ class RequestReplayThread(basethread.BaseThread):
server_address = (r.host, r.port)
server = connections.ServerConnection(
server_address,
- (self.config.options.listen_host, 0)
+ (self.options.listen_host, 0)
)
server.connect()
if r.scheme == "https":
server.establish_ssl(
- self.config.client_certs,
+ self.options.client_certs,
sni=self.f.server_conn.sni
)
r.first_line_format = "relative"
diff --git a/mitmproxy/test/taddons.py b/mitmproxy/test/taddons.py
index 49142871..6160746a 100644
--- a/mitmproxy/test/taddons.py
+++ b/mitmproxy/test/taddons.py
@@ -1,12 +1,11 @@
-import sys
import contextlib
+import sys
import mitmproxy.master
import mitmproxy.options
-from mitmproxy import proxy
from mitmproxy import addonmanager
-from mitmproxy import eventsequence
from mitmproxy import command
+from mitmproxy import eventsequence
from mitmproxy.addons import script
@@ -59,10 +58,11 @@ class context:
handlers can run as they would within mitmproxy. The context also
provides a number of helper methods for common testing scenarios.
"""
- def __init__(self, master = None, options = None):
+
+ def __init__(self, master=None, options=None):
options = options or mitmproxy.options.Options()
self.master = master or RecordingMaster(
- options, proxy.DummyServer(options)
+ options
)
self.options = self.master.options
self.wrapped = None
diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py
index 8c8cfe61..b2d4415d 100644
--- a/mitmproxy/tools/console/master.py
+++ b/mitmproxy/tools/console/master.py
@@ -15,6 +15,7 @@ import urwid
from mitmproxy import addons
from mitmproxy import master
from mitmproxy import log
+from mitmproxy import options # noqa
from mitmproxy.addons import intercept
from mitmproxy.addons import readfile
from mitmproxy.addons import view
@@ -28,8 +29,8 @@ from mitmproxy.tools.console import window
class ConsoleMaster(master.Master):
- def __init__(self, options, server):
- super().__init__(options, server)
+ def __init__(self, opts):
+ super().__init__(opts)
if not sys.stdout.isatty():
print("Error: mitmproxy's console interface requires a tty. "
@@ -38,8 +39,6 @@ class ConsoleMaster(master.Master):
self.view = view.View() # type: view.View
self.stream_path = None
- # This line is just for type hinting
- self.options = self.options # type: Options
self.keymap = keymap.Keymap(self)
defaultkeys.map(self.keymap)
self.options.errored.connect(self.options_error)
@@ -160,10 +159,10 @@ class ConsoleMaster(master.Master):
self.ui.start()
os.unlink(name)
- def set_palette(self, options, updated):
+ def set_palette(self, opts, updated):
self.ui.register_palette(
- palettes.palettes[options.console_palette].palette(
- options.console_palette_transparent
+ palettes.palettes[opts.console_palette].palette(
+ opts.console_palette_transparent
)
)
self.ui.clear()
diff --git a/mitmproxy/tools/console/statusbar.py b/mitmproxy/tools/console/statusbar.py
index 7628c475..5bfc611c 100644
--- a/mitmproxy/tools/console/statusbar.py
+++ b/mitmproxy/tools/console/statusbar.py
@@ -257,11 +257,11 @@ class StatusBar(urwid.WidgetWrap):
('heading', ("%s %s [%s/%s]" % (arrow, marked, offset, fc)).ljust(11)),
]
- if self.master.server.bound:
- host = self.master.server.address[0]
- if host == "0.0.0.0":
+ if self.master.options.server:
+ host = self.master.options.listen_host
+ if host == "0.0.0.0" or host == "":
host = "*"
- boundaddr = "[%s:%s]" % (host, self.master.server.address[1])
+ boundaddr = "[%s:%s]" % (host, self.master.options.listen_port)
else:
boundaddr = ""
t.extend(self.get_status())
diff --git a/mitmproxy/tools/dump.py b/mitmproxy/tools/dump.py
index 4d0ccf4b..af04f8a3 100644
--- a/mitmproxy/tools/dump.py
+++ b/mitmproxy/tools/dump.py
@@ -18,11 +18,10 @@ class DumpMaster(master.Master):
def __init__(
self,
options: options.Options,
- server,
with_termlog=True,
with_dumper=True,
) -> None:
- master.Master.__init__(self, options, server)
+ super().__init__(options)
self.errorcheck = ErrorCheck()
if with_termlog:
self.addons.add(termlog.TermLog(), termstatus.TermStatus())
diff --git a/mitmproxy/tools/main.py b/mitmproxy/tools/main.py
index 1575de98..6305d57f 100644
--- a/mitmproxy/tools/main.py
+++ b/mitmproxy/tools/main.py
@@ -76,7 +76,8 @@ def run(MasterKlass, args, extra=None): # pragma: no cover
else:
server = proxy.server.DummyServer(pconf)
- master = MasterKlass(opts, server)
+ master = MasterKlass(opts)
+ master.server = server
master.addons.trigger("configure", opts.keys())
master.addons.trigger("tick")
remaining = opts.update_known(**unknown)
diff --git a/mitmproxy/tools/web/master.py b/mitmproxy/tools/web/master.py
index a36d3a87..6453dc4e 100644
--- a/mitmproxy/tools/web/master.py
+++ b/mitmproxy/tools/web/master.py
@@ -17,8 +17,8 @@ from mitmproxy.tools.web import app, webaddons
class WebMaster(master.Master):
- def __init__(self, options, server, with_termlog=True):
- super().__init__(options, server)
+ def __init__(self, options, with_termlog=True):
+ super().__init__(options)
self.view = view.View()
self.view.sig_view_add.connect(self._sig_view_add)
self.view.sig_view_remove.connect(self._sig_view_remove)
@@ -45,8 +45,6 @@ class WebMaster(master.Master):
self.app = app.Application(
self, self.options.web_debug
)
- # This line is just for type hinting
- self.options = self.options # type: Options
def _sig_view_add(self, view, flow):
app.ClientConnection.broadcast(
diff --git a/test/filename_matching.py b/test/filename_matching.py
index 51cedf03..e74848d4 100644
--- a/test/filename_matching.py
+++ b/test/filename_matching.py
@@ -22,7 +22,7 @@ def check_src_files_have_test():
def check_test_files_have_src():
unknown_test_files = []
- excluded = ['test/mitmproxy/data/', 'test/mitmproxy/net/data/', '/tservers.py']
+ excluded = ['test/mitmproxy/data/', 'test/mitmproxy/net/data/', '/tservers.py', '/conftest.py']
test_files = glob.glob('test/mitmproxy/**/*.py', recursive=True) + glob.glob('test/pathod/**/*.py', recursive=True)
test_files = [f for f in test_files if os.path.basename(f) != '__init__.py']
test_files = [f for f in test_files if not any(os.path.normpath(p) in f for p in excluded)]
diff --git a/test/mitmproxy/addons/test_termstatus.py b/test/mitmproxy/addons/test_termstatus.py
index 2debaff5..5f960a1c 100644
--- a/test/mitmproxy/addons/test_termstatus.py
+++ b/test/mitmproxy/addons/test_termstatus.py
@@ -1,3 +1,4 @@
+from mitmproxy import proxy
from mitmproxy.addons import termstatus
from mitmproxy.test import taddons
@@ -5,6 +6,7 @@ from mitmproxy.test import taddons
def test_configure():
ts = termstatus.TermStatus()
with taddons.context() as ctx:
+ ctx.master.server = proxy.DummyServer()
ctx.configure(ts, server=False)
ts.running()
assert not ctx.master.logs
diff --git a/test/mitmproxy/proxy/protocol/test_http2.py b/test/mitmproxy/proxy/protocol/test_http2.py
index 583e6e27..5e6fa701 100644
--- a/test/mitmproxy/proxy/protocol/test_http2.py
+++ b/test/mitmproxy/proxy/protocol/test_http2.py
@@ -8,7 +8,6 @@ import pytest
import h2
from mitmproxy import options
-from mitmproxy.proxy.config import ProxyConfig
import mitmproxy.net
from ...net import tservers as net_tservers
@@ -89,10 +88,8 @@ class _Http2TestBase:
@classmethod
def setup_class(cls):
- opts = cls.get_options()
- cls.config = ProxyConfig(opts)
-
- tmaster = tservers.TestMaster(opts, cls.config)
+ cls.options = cls.get_options()
+ tmaster = tservers.TestMaster(cls.options)
cls.proxy = tservers.ProxyThread(tmaster)
cls.proxy.start()
@@ -319,7 +316,7 @@ class TestRequestWithPriority(_Http2Test):
(False, (None, None, None), (None, None, None)),
])
def test_request_with_priority(self, http2_priority_enabled, priority, expected_priority):
- self.config.options.http2_priority = http2_priority_enabled
+ self.options.http2_priority = http2_priority_enabled
h2_conn = self.setup_connection()
@@ -397,7 +394,7 @@ class TestPriority(_Http2Test):
(False, (True, 42424242, 42), []),
])
def test_priority(self, prioritize_before, http2_priority_enabled, priority, expected_priority):
- self.config.options.http2_priority = http2_priority_enabled
+ self.options.http2_priority = http2_priority_enabled
self.__class__.priority_data = []
h2_conn = self.setup_connection()
@@ -508,8 +505,10 @@ class TestBodySizeLimit(_Http2Test):
return True
def test_body_size_limit(self):
- self.config.options.body_size_limit = "20"
- self.config.options._processed["body_size_limit"] = 20
+ self.options.body_size_limit = "20"
+
+ # FIXME: This should not be required?
+ self.options._processed["body_size_limit"] = 20
h2_conn = self.setup_connection()
diff --git a/test/mitmproxy/proxy/protocol/test_websocket.py b/test/mitmproxy/proxy/protocol/test_websocket.py
index 58857f92..460d85f8 100644
--- a/test/mitmproxy/proxy/protocol/test_websocket.py
+++ b/test/mitmproxy/proxy/protocol/test_websocket.py
@@ -7,7 +7,6 @@ from mitmproxy import options
from mitmproxy import exceptions
from mitmproxy.http import HTTPFlow
from mitmproxy.websocket import WebSocketFlow
-from mitmproxy.proxy.config import ProxyConfig
from mitmproxy.net import tcp
from mitmproxy.net import http
@@ -49,10 +48,8 @@ class _WebSocketTestBase:
@classmethod
def setup_class(cls):
- opts = cls.get_options()
- cls.config = ProxyConfig(opts)
-
- tmaster = tservers.TestMaster(opts, cls.config)
+ cls.options = cls.get_options()
+ tmaster = tservers.TestMaster(cls.options)
cls.proxy = tservers.ProxyThread(tmaster)
cls.proxy.start()
diff --git a/test/mitmproxy/proxy/test_server.py b/test/mitmproxy/proxy/test_server.py
index 4cae756a..562f822c 100644
--- a/test/mitmproxy/proxy/test_server.py
+++ b/test/mitmproxy/proxy/test_server.py
@@ -117,13 +117,12 @@ class TcpMixin:
def _ignore_on(self):
assert not hasattr(self, "_ignore_backup")
- self._ignore_backup = self.config.check_ignore
- self.config.check_ignore = HostMatcher(
- [".+:%s" % self.server.port] + self.config.check_ignore.patterns)
+ self._ignore_backup = self.options.ignore_hosts
+ self.options.ignore_hosts = [".+:%s" % self.server.port] + self.options.ignore_hosts
def _ignore_off(self):
assert hasattr(self, "_ignore_backup")
- self.config.check_ignore = self._ignore_backup
+ self.options.ignore_hosts = self._ignore_backup
del self._ignore_backup
def test_ignore(self):
@@ -163,13 +162,12 @@ class TcpMixin:
def _tcpproxy_on(self):
assert not hasattr(self, "_tcpproxy_backup")
- self._tcpproxy_backup = self.config.check_tcp
- self.config.check_tcp = HostMatcher(
- [".+:%s" % self.server.port] + self.config.check_tcp.patterns)
+ self._tcpproxy_backup = self.options.tcp_hosts
+ self.options.tcp_hosts = [".+:%s" % self.server.port] + self.options.tcp_hosts
def _tcpproxy_off(self):
assert hasattr(self, "_tcpproxy_backup")
- self.config.check_tcp = self._tcpproxy_backup
+ self.options.tcp_hosts = self._tcpproxy_backup
del self._tcpproxy_backup
def test_tcp(self):
@@ -194,7 +192,8 @@ class TcpMixin:
i2_cert = certs.SSLCert(i2.sslinfo.certchain[0])
n_cert = certs.SSLCert(n.sslinfo.certchain[0])
- assert i_cert == i2_cert == n_cert
+ assert i_cert == i2_cert
+ assert i_cert != n_cert
# Make sure that TCP messages are in the event log.
# Re-enable and fix this when we start keeping TCPFlows in the state.
@@ -353,22 +352,22 @@ class TestHTTPS(tservers.HTTPProxyTest, CommonMixin, TcpMixin):
def test_clientcert_file(self):
try:
- self.config.client_certs = os.path.join(
+ self.options.client_certs = os.path.join(
tutils.test_data.path("mitmproxy/data/clientcert"), "client.pem")
f = self.pathod("304")
assert f.status_code == 304
assert self.server.last_log()["request"]["clientcert"]["keyinfo"]
finally:
- self.config.client_certs = None
+ self.options.client_certs = None
def test_clientcert_dir(self):
try:
- self.config.client_certs = tutils.test_data.path("mitmproxy/data/clientcert")
+ self.options.client_certs = tutils.test_data.path("mitmproxy/data/clientcert")
f = self.pathod("304")
assert f.status_code == 304
assert self.server.last_log()["request"]["clientcert"]["keyinfo"]
finally:
- self.config.client_certs = None
+ self.options.client_certs = None
def test_error_post_connect(self):
p = self.pathoc()
@@ -412,7 +411,7 @@ class TestHTTPSUpstreamServerVerificationWTrustedCert(tservers.HTTPProxyTest):
return p.request("get:/p/242")
def test_verification_w_cadir(self):
- self.config.options.update(
+ self.options.update(
ssl_insecure=False,
ssl_verify_upstream_trusted_cadir=tutils.test_data.path(
"mitmproxy/data/servercert/"
@@ -422,7 +421,7 @@ class TestHTTPSUpstreamServerVerificationWTrustedCert(tservers.HTTPProxyTest):
assert self._request().status_code == 242
def test_verification_w_pemfile(self):
- self.config.options.update(
+ self.options.update(
ssl_insecure=False,
ssl_verify_upstream_trusted_cadir=None,
ssl_verify_upstream_trusted_ca=tutils.test_data.path(
@@ -458,7 +457,7 @@ class TestHTTPSUpstreamServerVerificationWBadCert(tservers.HTTPProxyTest):
return opts
def test_no_verification_w_bad_cert(self):
- self.config.options.ssl_insecure = True
+ self.options.ssl_insecure = True
r = self._request()
assert r.status_code == 242
@@ -466,7 +465,7 @@ class TestHTTPSUpstreamServerVerificationWBadCert(tservers.HTTPProxyTest):
# We only test for a single invalid cert here.
# Actual testing of different root-causes (invalid hostname, expired, ...)
# is done in mitmproxy.net.
- self.config.options.ssl_insecure = False
+ self.options.ssl_insecure = False
r = self._request()
assert r.status_code == 502
assert b"Certificate Verification Error" in r.raw_content
@@ -493,7 +492,7 @@ class TestReverse(tservers.ReverseProxyTest, CommonMixin, TcpMixin):
reverse = True
def test_host_header(self):
- self.config.options.keep_host_header = True
+ self.options.keep_host_header = True
p = self.pathoc()
with p.connect():
resp = p.request("get:/p/200:h'Host'='example.com'")
@@ -503,7 +502,7 @@ class TestReverse(tservers.ReverseProxyTest, CommonMixin, TcpMixin):
assert req.host_header == "example.com"
def test_overridden_host_header(self):
- self.config.options.keep_host_header = False # default value
+ self.options.keep_host_header = False # default value
p = self.pathoc()
with p.connect():
resp = p.request("get:/p/200:h'Host'='example.com'")
diff --git a/test/mitmproxy/test_addonmanager.py b/test/mitmproxy/test_addonmanager.py
index 678bc1b7..3ac74375 100644
--- a/test/mitmproxy/test_addonmanager.py
+++ b/test/mitmproxy/test_addonmanager.py
@@ -6,7 +6,6 @@ from mitmproxy import exceptions
from mitmproxy import options
from mitmproxy import command
from mitmproxy import master
-from mitmproxy import proxy
from mitmproxy.test import taddons
from mitmproxy.test import tflow
@@ -51,7 +50,7 @@ def test_command():
def test_halt():
o = options.Options()
- m = master.Master(o, proxy.DummyServer(o))
+ m = master.Master(o)
a = addonmanager.AddonManager(m)
halt = THalt()
end = TAddon("end")
@@ -68,7 +67,7 @@ def test_halt():
def test_lifecycle():
o = options.Options()
- m = master.Master(o, proxy.DummyServer(o))
+ m = master.Master(o)
a = addonmanager.AddonManager(m)
a.add(TAddon("one"))
@@ -128,7 +127,7 @@ def test_simple():
def test_load_option():
o = options.Options()
- m = master.Master(o, proxy.DummyServer(o))
+ m = master.Master(o)
a = addonmanager.AddonManager(m)
a.add(AOption())
assert "custom_option" in m.options._options
@@ -136,7 +135,7 @@ def test_load_option():
def test_nesting():
o = options.Options()
- m = master.Master(o, proxy.DummyServer(o))
+ m = master.Master(o)
a = addonmanager.AddonManager(m)
a.add(
diff --git a/test/mitmproxy/test_controller.py b/test/mitmproxy/test_controller.py
index 2e13d298..e840380a 100644
--- a/test/mitmproxy/test_controller.py
+++ b/test/mitmproxy/test_controller.py
@@ -30,7 +30,8 @@ class TestMaster:
assert ctx.master.should_exit.is_set()
def test_server_simple(self):
- m = master.Master(None, proxy.DummyServer(None))
+ m = master.Master(None)
+ m.server = proxy.DummyServer()
m.start()
m.shutdown()
m.start()
diff --git a/test/mitmproxy/test_flow.py b/test/mitmproxy/test_flow.py
index 0b04c4c1..7f9d577b 100644
--- a/test/mitmproxy/test_flow.py
+++ b/test/mitmproxy/test_flow.py
@@ -6,13 +6,11 @@ from mitmproxy.test import tflow, tutils
import mitmproxy.io
from mitmproxy import flowfilter
from mitmproxy import options
-from mitmproxy.proxy import config
from mitmproxy.io import tnetstring
from mitmproxy.exceptions import FlowReadException, ReplayException, ControlException
from mitmproxy import flow
from mitmproxy import http
from mitmproxy.net import http as net_http
-from mitmproxy.proxy.server import DummyServer
from mitmproxy import master
from . import tservers
@@ -93,8 +91,7 @@ class TestFlowMaster:
opts = options.Options(
mode="reverse:https://use-this-domain"
)
- conf = config.ProxyConfig(opts)
- fm = master.Master(opts, DummyServer(conf))
+ fm = master.Master(opts)
fm.addons.add(s)
f = tflow.tflow(resp=True)
fm.load_flow(f)
@@ -102,8 +99,7 @@ class TestFlowMaster:
def test_replay(self):
opts = options.Options()
- conf = config.ProxyConfig(opts)
- fm = master.Master(opts, DummyServer(conf))
+ fm = master.Master(opts)
f = tflow.tflow(resp=True)
f.request.content = None
with pytest.raises(ReplayException, match="missing"):
@@ -131,7 +127,7 @@ class TestFlowMaster:
def test_all(self):
s = tservers.TestState()
- fm = master.Master(None, DummyServer())
+ fm = master.Master(None)
fm.addons.add(s)
f = tflow.tflow(req=None)
fm.addons.handle_lifecycle("clientconnect", f.client_conn)
diff --git a/test/mitmproxy/tools/console/test_master.py b/test/mitmproxy/tools/console/test_master.py
index ef357c76..3aa0dc54 100644
--- a/test/mitmproxy/tools/console/test_master.py
+++ b/test/mitmproxy/tools/console/test_master.py
@@ -1,7 +1,6 @@
import urwid
from mitmproxy import options
-from mitmproxy import proxy
from mitmproxy.test import tflow
from mitmproxy.test import tutils
from mitmproxy.tools import console
@@ -30,7 +29,7 @@ class TestMaster(tservers.MasterTest):
if "verbosity" not in opts:
opts["verbosity"] = 'warn'
o = options.Options(**opts)
- m = console.master.ConsoleMaster(o, proxy.DummyServer())
+ m = console.master.ConsoleMaster(o)
m.addons.trigger("configure", o.keys())
return m
diff --git a/test/mitmproxy/tools/console/test_statusbar.py b/test/mitmproxy/tools/console/test_statusbar.py
index 55a3c4a0..2f7825c9 100644
--- a/test/mitmproxy/tools/console/test_statusbar.py
+++ b/test/mitmproxy/tools/console/test_statusbar.py
@@ -1,4 +1,4 @@
-from mitmproxy import options, proxy
+from mitmproxy import options
from mitmproxy.tools.console import statusbar, master
@@ -26,7 +26,7 @@ def test_statusbar(monkeypatch):
scripts=["nonexistent"],
save_stream_file="foo",
)
- m = master.ConsoleMaster(o, proxy.DummyServer())
+ m = master.ConsoleMaster(o)
monkeypatch.setattr(m.addons.get("clientplayback"), "count", lambda: 42)
monkeypatch.setattr(m.addons.get("serverplayback"), "count", lambda: 42)
diff --git a/test/mitmproxy/tools/test_dump.py b/test/mitmproxy/tools/test_dump.py
index 597333af..952c3f4f 100644
--- a/test/mitmproxy/tools/test_dump.py
+++ b/test/mitmproxy/tools/test_dump.py
@@ -1,7 +1,6 @@
import pytest
from unittest import mock
-from mitmproxy import proxy
from mitmproxy import log
from mitmproxy import controller
from mitmproxy import options
@@ -13,7 +12,7 @@ from .. import tservers
class TestDumpMaster(tservers.MasterTest):
def mkmaster(self, flt, **opts):
o = options.Options(view_filter=flt, verbosity='error', flow_detail=0, **opts)
- m = dump.DumpMaster(o, proxy.DummyServer(), with_termlog=False, with_dumper=False)
+ m = dump.DumpMaster(o, with_termlog=False, with_dumper=False)
return m
def test_has_error(self):
@@ -27,12 +26,12 @@ class TestDumpMaster(tservers.MasterTest):
def test_addons_termlog(self, termlog):
with mock.patch('sys.stdout'):
o = options.Options()
- m = dump.DumpMaster(o, proxy.DummyServer(), with_termlog=termlog)
+ m = dump.DumpMaster(o, with_termlog=termlog)
assert (m.addons.get('termlog') is not None) == termlog
@pytest.mark.parametrize("dumper", [False, True])
def test_addons_dumper(self, dumper):
with mock.patch('sys.stdout'):
o = options.Options()
- m = dump.DumpMaster(o, proxy.DummyServer(), with_dumper=dumper)
+ m = dump.DumpMaster(o, with_dumper=dumper)
assert (m.addons.get('dumper') is not None) == dumper
diff --git a/test/mitmproxy/tools/web/test_app.py b/test/mitmproxy/tools/web/test_app.py
index 4d290284..2362508f 100644
--- a/test/mitmproxy/tools/web/test_app.py
+++ b/test/mitmproxy/tools/web/test_app.py
@@ -7,7 +7,6 @@ from tornado import httpclient
from tornado import websocket
from mitmproxy import exceptions
-from mitmproxy import proxy
from mitmproxy import options
from mitmproxy.test import tflow
from mitmproxy.tools.web import app
@@ -21,7 +20,7 @@ def json(resp: httpclient.HTTPResponse):
class TestApp(tornado.testing.AsyncHTTPTestCase):
def get_app(self):
o = options.Options(http2=False)
- m = webmaster.WebMaster(o, proxy.DummyServer(), with_termlog=False)
+ m = webmaster.WebMaster(o, with_termlog=False)
f = tflow.tflow(resp=True)
f.id = "42"
m.view.add([f])
diff --git a/test/mitmproxy/tools/web/test_master.py b/test/mitmproxy/tools/web/test_master.py
index 27f99a18..2bceb5ca 100644
--- a/test/mitmproxy/tools/web/test_master.py
+++ b/test/mitmproxy/tools/web/test_master.py
@@ -1,7 +1,5 @@
from mitmproxy.tools.web import master
-from mitmproxy import proxy
from mitmproxy import options
-from mitmproxy.proxy.config import ProxyConfig
from ... import tservers
@@ -9,8 +7,7 @@ from ... import tservers
class TestWebMaster(tservers.MasterTest):
def mkmaster(self, **opts):
o = options.Options(**opts)
- c = ProxyConfig(o)
- return master.WebMaster(o, proxy.DummyServer(c))
+ return master.WebMaster(o)
def test_basic(self):
m = self.mkmaster()
diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py
index 9faaf20e..dd5bb327 100644
--- a/test/mitmproxy/tservers.py
+++ b/test/mitmproxy/tservers.py
@@ -69,9 +69,10 @@ class TestState:
class TestMaster(taddons.RecordingMaster):
- def __init__(self, opts, config):
- s = ProxyServer(config)
- super().__init__(opts, s)
+ def __init__(self, opts):
+ super().__init__(opts)
+ config = ProxyConfig(opts)
+ self.server = ProxyServer(config)
def clear_addons(self, addons):
self.addons.clear()
@@ -129,9 +130,8 @@ class ProxyTestBase:
ssl=cls.ssl,
ssloptions=cls.ssloptions)
- opts = cls.get_options()
- cls.config = ProxyConfig(opts)
- tmaster = cls.masterclass(opts, cls.config)
+ cls.options = cls.get_options()
+ tmaster = cls.masterclass(cls.options)
cls.proxy = ProxyThread(tmaster)
cls.proxy.start()
@@ -338,19 +338,16 @@ class ChainProxyTest(ProxyTestBase):
@classmethod
def setup_class(cls):
+ # We need to initialize the chain first so that the normal server gets a correct config.
cls.chain = []
- super().setup_class()
for _ in range(cls.n):
opts = cls.get_options()
- config = ProxyConfig(opts)
- tmaster = cls.masterclass(opts, config)
+ tmaster = cls.masterclass(opts)
proxy = ProxyThread(tmaster)
proxy.start()
cls.chain.insert(0, proxy)
- # Patch the orginal proxy to upstream mode
- opts = cls.get_options()
- cls.config = cls.proxy.tmaster.config = cls.proxy.tmaster.server.config = ProxyConfig(opts)
+ super().setup_class()
@classmethod
def teardown_class(cls):