aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@corte.si>2018-02-24 17:20:53 +1300
committerGitHub <noreply@github.com>2018-02-24 17:20:53 +1300
commiteee109117f956600261bc938be52040d1474a97f (patch)
tree4efe06cfc2a19ea6688915558b54c6c9075d94b4
parent16dd7f3ddf012426f2ddcb5792cf35be528c6e09 (diff)
parent3a766a420cb6fc0b1c9d0480e00b3250ec8a22c4 (diff)
downloadmitmproxy-eee109117f956600261bc938be52040d1474a97f.tar.gz
mitmproxy-eee109117f956600261bc938be52040d1474a97f.tar.bz2
mitmproxy-eee109117f956600261bc938be52040d1474a97f.zip
Merge pull request #2905 from cortesi/opts
Start migrating addon options into /addons
-rw-r--r--.gitignore1
-rw-r--r--mitmproxy/addons/anticache.py9
-rw-r--r--mitmproxy/addons/anticomp.py6
-rw-r--r--mitmproxy/addons/clientplayback.py6
-rw-r--r--mitmproxy/addons/keepserving.py10
-rw-r--r--mitmproxy/addons/onboarding.py20
-rw-r--r--mitmproxy/addons/readfile.py5
-rw-r--r--mitmproxy/addons/replace.py10
-rw-r--r--mitmproxy/addons/save.py10
-rw-r--r--mitmproxy/addons/script.py8
-rw-r--r--mitmproxy/addons/serverplayback.py56
-rw-r--r--mitmproxy/addons/setheaders.py11
-rw-r--r--mitmproxy/addons/stickyauth.py8
-rw-r--r--mitmproxy/addons/stickycookie.py6
-rw-r--r--mitmproxy/addons/streambodies.py19
-rw-r--r--mitmproxy/addons/upstream_auth.py10
-rw-r--r--mitmproxy/options.py212
-rw-r--r--mitmproxy/optmanager.py7
-rw-r--r--mitmproxy/test/taddons.py7
-rwxr-xr-xtest/helper_tools/dumperview.py3
-rw-r--r--test/mitmproxy/addons/test_allowremote.py3
-rw-r--r--test/mitmproxy/addons/test_anticache.py2
-rw-r--r--test/mitmproxy/addons/test_anticomp.py2
-rw-r--r--test/mitmproxy/addons/test_clientplayback.py6
-rw-r--r--test/mitmproxy/addons/test_core.py25
-rw-r--r--test/mitmproxy/addons/test_dumper.py15
-rw-r--r--test/mitmproxy/addons/test_intercept.py3
-rw-r--r--test/mitmproxy/addons/test_keepserving.py3
-rw-r--r--test/mitmproxy/addons/test_onboarding.py18
-rw-r--r--test/mitmproxy/addons/test_readfile.py10
-rw-r--r--test/mitmproxy/addons/test_replace.py10
-rw-r--r--test/mitmproxy/addons/test_save.py3
-rw-r--r--test/mitmproxy/addons/test_script.py11
-rw-r--r--test/mitmproxy/addons/test_serverplayback.py32
-rw-r--r--test/mitmproxy/addons/test_setheaders.py4
-rw-r--r--test/mitmproxy/addons/test_stickyauth.py4
-rw-r--r--test/mitmproxy/addons/test_stickycookie.py16
-rw-r--r--test/mitmproxy/addons/test_streambodies.py2
-rw-r--r--test/mitmproxy/addons/test_upstream_auth.py4
-rw-r--r--test/mitmproxy/test_optmanager.py6
-rw-r--r--test/mitmproxy/tools/console/test_master.py4
-rw-r--r--test/mitmproxy/tools/console/test_statusbar.py8
-rw-r--r--test/mitmproxy/tools/web/test_static_viewer.py5
-rw-r--r--test/mitmproxy/tservers.py4
44 files changed, 313 insertions, 311 deletions
diff --git a/.gitignore b/.gitignore
index 9fade1c3..1bb90c1a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@ MANIFEST
build/
dist/
mitmproxy/contrib/kaitaistruct/*.ksy
+.pytest_cache
# UI
diff --git a/mitmproxy/addons/anticache.py b/mitmproxy/addons/anticache.py
index 5b34d5a5..9f5c2dc1 100644
--- a/mitmproxy/addons/anticache.py
+++ b/mitmproxy/addons/anticache.py
@@ -2,6 +2,15 @@ from mitmproxy import ctx
class AntiCache:
+ def load(self, loader):
+ loader.add_option(
+ "anticache", bool, False,
+ """
+ Strip out request headers that might cause the server to return
+ 304-not-modified.
+ """
+ )
+
def request(self, flow):
if ctx.options.anticache:
flow.request.anticache()
diff --git a/mitmproxy/addons/anticomp.py b/mitmproxy/addons/anticomp.py
index d7d1ca8d..3415302a 100644
--- a/mitmproxy/addons/anticomp.py
+++ b/mitmproxy/addons/anticomp.py
@@ -2,6 +2,12 @@ from mitmproxy import ctx
class AntiComp:
+ def load(self, loader):
+ loader.add_option(
+ "anticomp", bool, False,
+ "Try to convince servers to send us un-compressed data."
+ )
+
def request(self, flow):
if ctx.options.anticomp:
flow.request.anticomp()
diff --git a/mitmproxy/addons/clientplayback.py b/mitmproxy/addons/clientplayback.py
index 2dd488b9..a017ec0f 100644
--- a/mitmproxy/addons/clientplayback.py
+++ b/mitmproxy/addons/clientplayback.py
@@ -14,6 +14,12 @@ class ClientPlayback:
self.current_thread = None
self.configured = False
+ def load(self, loader):
+ loader.add_option(
+ "client_replay", typing.Sequence[str], [],
+ "Replay client requests from a saved file."
+ )
+
def count(self) -> int:
if self.current_thread:
current = 1
diff --git a/mitmproxy/addons/keepserving.py b/mitmproxy/addons/keepserving.py
index 9c975a7b..6413299d 100644
--- a/mitmproxy/addons/keepserving.py
+++ b/mitmproxy/addons/keepserving.py
@@ -2,6 +2,16 @@ from mitmproxy import ctx
class KeepServing:
+ def load(self, loader):
+ loader.add_option(
+ "keepserving", bool, False,
+ """
+ Continue serving after client playback, server playback or file
+ read. This option is ignored by interactive tools, which always keep
+ serving.
+ """
+ )
+
def event_processing_complete(self):
if not ctx.master.options.keepserving:
ctx.master.shutdown()
diff --git a/mitmproxy/addons/onboarding.py b/mitmproxy/addons/onboarding.py
index 07536c34..900acb08 100644
--- a/mitmproxy/addons/onboarding.py
+++ b/mitmproxy/addons/onboarding.py
@@ -2,6 +2,9 @@ from mitmproxy.addons import wsgiapp
from mitmproxy.addons.onboardingapp import app
from mitmproxy import ctx
+APP_HOST = "mitm.it"
+APP_PORT = 80
+
class Onboarding(wsgiapp.WSGIApp):
name = "onboarding"
@@ -9,6 +12,23 @@ class Onboarding(wsgiapp.WSGIApp):
def __init__(self):
super().__init__(app.Adapter(app.application), None, None)
+ def load(self, loader):
+ loader.add_option(
+ "onboarding", bool, True,
+ "Toggle the mitmproxy onboarding app."
+ )
+ loader.add_option(
+ "onboarding_host", str, APP_HOST,
+ """
+ Onboarding app domain. For transparent mode, use an IP when a DNS
+ entry for the app domain is not present.
+ """
+ )
+ loader.add_option(
+ "onboarding_port", int, APP_PORT,
+ "Port to serve the onboarding app from."
+ )
+
def configure(self, updated):
self.host = ctx.options.onboarding_host
self.port = ctx.options.onboarding_port
diff --git a/mitmproxy/addons/readfile.py b/mitmproxy/addons/readfile.py
index 05b6c309..aaf02d01 100644
--- a/mitmproxy/addons/readfile.py
+++ b/mitmproxy/addons/readfile.py
@@ -11,6 +11,11 @@ class ReadFile:
"""
An addon that handles reading from file on startup.
"""
+ def load(self, loader):
+ loader.add_option(
+ "rfile", typing.Optional[str], None,
+ "Read flows from file."
+ )
def load_flows(self, fo: typing.IO[bytes]) -> int:
cnt = 0
diff --git a/mitmproxy/addons/replace.py b/mitmproxy/addons/replace.py
index 054264fa..5173254a 100644
--- a/mitmproxy/addons/replace.py
+++ b/mitmproxy/addons/replace.py
@@ -1,5 +1,6 @@
import os
import re
+import typing
from mitmproxy import exceptions
from mitmproxy import flowfilter
@@ -47,6 +48,15 @@ class Replace:
def __init__(self):
self.lst = []
+ def load(self, loader):
+ loader.add_option(
+ "replacements", typing.Sequence[str], [],
+ """
+ Replacement patterns of the form "/pattern/regex/replacement", where
+ the separator can be any character.
+ """
+ )
+
def configure(self, updated):
"""
.replacements is a list of tuples (fpat, rex, s):
diff --git a/mitmproxy/addons/save.py b/mitmproxy/addons/save.py
index 44afef68..e6e98ff8 100644
--- a/mitmproxy/addons/save.py
+++ b/mitmproxy/addons/save.py
@@ -16,6 +16,16 @@ class Save:
self.filt = None
self.active_flows = set() # type: Set[flow.Flow]
+ def load(self, loader):
+ loader.add_option(
+ "save_stream_file", typing.Optional[str], None,
+ "Stream flows to file as they arrive. Prefix path with + to append."
+ )
+ loader.add_option(
+ "save_stream_filter", typing.Optional[str], None,
+ "Filter which flows are written to file."
+ )
+
def open_file(self, path):
if path.startswith("+"):
path = path[1:]
diff --git a/mitmproxy/addons/script.py b/mitmproxy/addons/script.py
index 0a524359..dcad943a 100644
--- a/mitmproxy/addons/script.py
+++ b/mitmproxy/addons/script.py
@@ -98,6 +98,14 @@ class ScriptLoader:
self.is_running = False
self.addons = []
+ def load(self, loader):
+ loader.add_option(
+ "scripts", typing.Sequence[str], [],
+ """
+ Execute a script.
+ """
+ )
+
def running(self):
self.is_running = True
diff --git a/mitmproxy/addons/serverplayback.py b/mitmproxy/addons/serverplayback.py
index d8b2299a..73fb1666 100644
--- a/mitmproxy/addons/serverplayback.py
+++ b/mitmproxy/addons/serverplayback.py
@@ -1,8 +1,6 @@
import hashlib
import urllib
import typing
-from typing import Any # noqa
-from typing import List # noqa
from mitmproxy import ctx
from mitmproxy import flow
@@ -19,6 +17,60 @@ class ServerPlayback:
self.final_flow = None
self.configured = False
+ def load(self, loader):
+ loader.add_option(
+ "server_replay_kill_extra", bool, False,
+ "Kill extra requests during replay."
+ )
+ loader.add_option(
+ "server_replay_nopop", bool, False,
+ """
+ Don't remove flows from server replay state after use. This makes it
+ possible to replay same response multiple times.
+ """
+ )
+ loader.add_option(
+ "server_replay_refresh", bool, True,
+ """
+ Refresh server replay responses by adjusting date, expires and
+ last-modified headers, as well as adjusting cookie expiration.
+ """
+ )
+ loader.add_option(
+ "server_replay_use_headers", typing.Sequence[str], [],
+ "Request headers to be considered during replay."
+ )
+ loader.add_option(
+ "server_replay", typing.Sequence[str], [],
+ "Replay server responses from a saved file."
+ )
+ loader.add_option(
+ "server_replay_ignore_content", bool, False,
+ "Ignore request's content while searching for a saved flow to replay."
+ )
+ loader.add_option(
+ "server_replay_ignore_params", typing.Sequence[str], [],
+ """
+ Request's parameters to be ignored while searching for a saved flow
+ to replay.
+ """
+ )
+ loader.add_option(
+ "server_replay_ignore_payload_params", typing.Sequence[str], [],
+ """
+ Request's payload parameters (application/x-www-form-urlencoded or
+ multipart/form-data) to be ignored while searching for a saved flow
+ to replay.
+ """
+ )
+ loader.add_option(
+ "server_replay_ignore_host", bool, False,
+ """
+ Ignore request's destination host while searching for a saved flow
+ to replay.
+ """
+ )
+
@command.command("replay.server")
def load_flows(self, flows: typing.Sequence[flow.Flow]) -> None:
"""
diff --git a/mitmproxy/addons/setheaders.py b/mitmproxy/addons/setheaders.py
index d4d16e40..3517f70f 100644
--- a/mitmproxy/addons/setheaders.py
+++ b/mitmproxy/addons/setheaders.py
@@ -1,3 +1,5 @@
+import typing
+
from mitmproxy import exceptions
from mitmproxy import flowfilter
from mitmproxy import ctx
@@ -44,6 +46,15 @@ class SetHeaders:
def __init__(self):
self.lst = []
+ def load(self, loader):
+ loader.add_option(
+ "setheaders", typing.Sequence[str], [],
+ """
+ Header set pattern of the form "/pattern/header/value", where the
+ separator can be any character.
+ """
+ )
+
def configure(self, updated):
if "setheaders" in updated:
self.lst = []
diff --git a/mitmproxy/addons/stickyauth.py b/mitmproxy/addons/stickyauth.py
index 24831d5b..ab0599ee 100644
--- a/mitmproxy/addons/stickyauth.py
+++ b/mitmproxy/addons/stickyauth.py
@@ -1,3 +1,5 @@
+import typing
+
from mitmproxy import exceptions
from mitmproxy import flowfilter
from mitmproxy import ctx
@@ -8,6 +10,12 @@ class StickyAuth:
self.flt = None
self.hosts = {}
+ def load(self, loader):
+ loader.add_option(
+ "stickyauth", typing.Optional[str], None,
+ "Set sticky auth filter. Matched against requests."
+ )
+
def configure(self, updated):
if "stickyauth" in updated:
if ctx.options.stickyauth:
diff --git a/mitmproxy/addons/stickycookie.py b/mitmproxy/addons/stickycookie.py
index e58e0a58..e5f85fa1 100644
--- a/mitmproxy/addons/stickycookie.py
+++ b/mitmproxy/addons/stickycookie.py
@@ -34,6 +34,12 @@ class StickyCookie:
self.jar = collections.defaultdict(dict) # type: Dict[TOrigin, Dict[str, str]]
self.flt = None # type: Optional[flowfilter.TFilter]
+ def load(self, loader):
+ loader.add_option(
+ "stickycookie", Optional[str], None,
+ "Set sticky cookie filter. Matched against requests."
+ )
+
def configure(self, updated):
if "stickycookie" in updated:
if ctx.options.stickycookie:
diff --git a/mitmproxy/addons/streambodies.py b/mitmproxy/addons/streambodies.py
index c841075f..6ca9918f 100644
--- a/mitmproxy/addons/streambodies.py
+++ b/mitmproxy/addons/streambodies.py
@@ -1,3 +1,5 @@
+import typing
+
from mitmproxy.net.http import http1
from mitmproxy import exceptions
from mitmproxy import ctx
@@ -8,6 +10,23 @@ class StreamBodies:
def __init__(self):
self.max_size = None
+ def load(self, loader):
+ loader.add_option(
+ "stream_large_bodies", typing.Optional[str], None,
+ """
+ Stream data to the client if response body exceeds the given
+ threshold. If streamed, the body will not be stored in any way.
+ Understands k/m/g suffixes, i.e. 3m for 3 megabytes.
+ """
+ )
+ loader.add_option(
+ "stream_websockets", bool, False,
+ """
+ Stream WebSocket messages between client and server.
+ Messages are captured and cannot be modified.
+ """
+ )
+
def configure(self, updated):
if "stream_large_bodies" in updated and ctx.options.stream_large_bodies:
try:
diff --git a/mitmproxy/addons/upstream_auth.py b/mitmproxy/addons/upstream_auth.py
index 685494c2..ea6af337 100644
--- a/mitmproxy/addons/upstream_auth.py
+++ b/mitmproxy/addons/upstream_auth.py
@@ -1,4 +1,5 @@
import re
+import typing
import base64
from mitmproxy import exceptions
@@ -28,6 +29,15 @@ class UpstreamAuth():
def __init__(self):
self.auth = None
+ def load(self, loader):
+ loader.add_option(
+ "upstream_auth", typing.Optional[str], None,
+ """
+ Add HTTP Basic authentication to upstream proxy and reverse proxy
+ requests. Format: username:password.
+ """
+ )
+
def configure(self, updated):
# FIXME: We're doing this because our proxy core is terminally confused
# at the moment. Ideally, we should be able to check if we're in
diff --git a/mitmproxy/options.py b/mitmproxy/options.py
index 76060548..70d454fd 100644
--- a/mitmproxy/options.py
+++ b/mitmproxy/options.py
@@ -12,8 +12,6 @@ log_verbosity = [
"debug",
]
-APP_HOST = "mitm.it"
-APP_PORT = 80
CA_DIR = "~/.mitmproxy"
LISTEN_PORT = 8080
@@ -30,202 +28,55 @@ class Options(optmanager.OptManager):
# This provides type hints for IDEs (e.g. PyCharm) and mypy.
# Autogenerated using test/helper_tools/typehints_for_options.py
add_upstream_certs_to_client_chain = None # type: bool
- allow_remote = None # type: bool
- anticache = None # type: bool
- anticomp = None # type: bool
body_size_limit = None # type: Optional[str]
cadir = None # type: str
certs = None # type: Sequence[str]
ciphers_client = None # type: Optional[str]
ciphers_server = None # type: Optional[str]
client_certs = None # type: Optional[str]
- client_replay = None # type: Sequence[str]
- console_focus_follow = None # type: bool
- console_layout = None # type: str
- console_layout_headers = None # type: bool
- console_mouse = None # type: bool
- console_palette = None # type: str
- console_palette_transparent = None # type: bool
- default_contentview = None # type: str
- flow_detail = None # type: int
http2 = None # type: bool
http2_priority = None # type: bool
ignore_hosts = None # type: Sequence[str]
- intercept = None # type: Optional[str]
- intercept_active = None # type: bool
keep_host_header = None # type: bool
- keepserving = None # type: bool
listen_host = None # type: str
listen_port = None # type: int
mode = None # type: str
- onboarding = None # type: bool
- onboarding_host = None # type: str
- onboarding_port = None # type: int
- proxyauth = None # type: Optional[str]
rawtcp = None # type: bool
- server_replay_refresh = None # type: bool
- replacements = None # type: Sequence[str]
- server_replay_kill_extra = None # type: bool
- rfile = None # type: Optional[str]
- save_stream_file = None # type: Optional[str]
- save_stream_filter = None # type: Optional[str]
- scripts = None # type: Sequence[str]
server = None # type: bool
- server_replay = None # type: Sequence[str]
- server_replay_ignore_content = None # type: bool
- server_replay_ignore_host = None # type: bool
- server_replay_ignore_params = None # type: Sequence[str]
- server_replay_ignore_payload_params = None # type: Sequence[str]
- server_replay_nopop = None # type: bool
- server_replay_use_headers = None # type: Sequence[str]
- setheaders = None # type: Sequence[str]
- showhost = None # type: bool
spoof_source_address = None # type: bool
ssl_insecure = None # type: bool
ssl_verify_upstream_trusted_ca = None # type: Optional[str]
ssl_verify_upstream_trusted_cadir = None # type: Optional[str]
ssl_version_client = None # type: str
ssl_version_server = None # type: str
- stickyauth = None # type: Optional[str]
- stickycookie = None # type: Optional[str]
- stream_large_bodies = None # type: Optional[str]
- stream_websockets = None # type: bool
tcp_hosts = None # type: Sequence[str]
- upstream_auth = None # type: Optional[str]
upstream_bind_address = None # type: str
upstream_cert = None # type: bool
+ websocket = None # type: bool
+
+ # FIXME: Options that must be migrated to addons, but are complicated
+ # because they're used by more than one addon, or because they're
+ # embedded in the core code somehow.
+ default_contentview = None # type: str
+ flow_detail = None # type: int
+ intercept = None # type: Optional[str]
+ intercept_active = None # type: bool
+ proxyauth = None # type: Optional[str]
+ showhost = None # type: bool
verbosity = None # type: str
view_filter = None # type: Optional[str]
- view_order = None # type: str
- view_order_reversed = None # type: bool
- web_debug = None # type: bool
- web_iface = None # type: str
- web_open_browser = None # type: bool
- web_port = None # type: int
- websocket = None # type: bool
def __init__(self, **kwargs) -> None:
super().__init__()
self.add_option(
- "onboarding", bool, True,
- "Toggle the mitmproxy onboarding app."
- )
- self.add_option(
- "onboarding_host", str, APP_HOST,
- """
- Onboarding app domain. For transparent mode, use an IP when a DNS
- entry for the app domain is not present.
- """
- )
- self.add_option(
- "onboarding_port", int, APP_PORT,
- "Port to serve the onboarding app from."
- )
- self.add_option(
- "anticache", bool, False,
- """
- Strip out request headers that might cause the server to return
- 304-not-modified.
- """
- )
- self.add_option(
- "anticomp", bool, False,
- "Try to convince servers to send us un-compressed data."
- )
- self.add_option(
- "client_replay", Sequence[str], [],
- "Replay client requests from a saved file."
- )
- self.add_option(
- "server_replay_kill_extra", bool, False,
- "Kill extra requests during replay."
- )
- self.add_option(
- "keepserving", bool, False,
- """
- Continue serving after client playback, server playback or file
- read. This option is ignored by interactive tools, which always keep
- serving.
- """
- )
- self.add_option(
"server", bool, True,
"Start a proxy server. Enabled by default."
)
self.add_option(
- "server_replay_nopop", bool, False,
- """
- Don't remove flows from server replay state after use. This makes it
- possible to replay same response multiple times.
- """
- )
- self.add_option(
- "server_replay_refresh", bool, True,
- """
- Refresh server replay responses by adjusting date, expires and
- last-modified headers, as well as adjusting cookie expiration.
- """
- )
- self.add_option(
- "rfile", Optional[str], None,
- "Read flows from file."
- )
- self.add_option(
- "scripts", Sequence[str], [],
- """
- Execute a script.
- """
- )
- self.add_option(
"showhost", bool, False,
"Use the Host header to construct URLs for display."
)
self.add_option(
- "replacements", Sequence[str], [],
- """
- Replacement patterns of the form "/pattern/regex/replacement", where
- the separator can be any character.
- """
- )
- self.add_option(
- "server_replay_use_headers", Sequence[str], [],
- "Request headers to be considered during replay."
- )
- self.add_option(
- "setheaders", Sequence[str], [],
- """
- Header set pattern of the form "/pattern/header/value", where the
- separator can be any character.
- """
- )
- self.add_option(
- "server_replay", Sequence[str], [],
- "Replay server responses from a saved file."
- )
- self.add_option(
- "stickycookie", Optional[str], None,
- "Set sticky cookie filter. Matched against requests."
- )
- self.add_option(
- "stickyauth", Optional[str], None,
- "Set sticky auth filter. Matched against requests."
- )
- self.add_option(
- "stream_large_bodies", Optional[str], None,
- """
- Stream data to the client if response body exceeds the given
- threshold. If streamed, the body will not be stored in any way.
- Understands k/m/g suffixes, i.e. 3m for 3 megabytes.
- """
- )
- self.add_option(
- "stream_websockets", bool, False,
- """
- Stream WebSocket messages between client and server.
- Messages are captured and cannot be modified.
- """
- )
- self.add_option(
"verbosity", str, 'info',
"Log verbosity.",
choices=log_verbosity
@@ -235,40 +86,6 @@ class Options(optmanager.OptManager):
"The default content view mode.",
choices = [i.name.lower() for i in contentviews.views]
)
- self.add_option(
- "save_stream_file", Optional[str], None,
- "Stream flows to file as they arrive. Prefix path with + to append."
- )
- self.add_option(
- "save_stream_filter", Optional[str], None,
- "Filter which flows are written to file."
- )
- self.add_option(
- "server_replay_ignore_content", bool, False,
- "Ignore request's content while searching for a saved flow to replay."
- )
- self.add_option(
- "server_replay_ignore_params", Sequence[str], [],
- """
- Request's parameters to be ignored while searching for a saved flow
- to replay.
- """
- )
- self.add_option(
- "server_replay_ignore_payload_params", Sequence[str], [],
- """
- Request's payload parameters (application/x-www-form-urlencoded or
- multipart/form-data) to be ignored while searching for a saved flow
- to replay.
- """
- )
- self.add_option(
- "server_replay_ignore_host", bool, False,
- """
- Ignore request's destination host while searching for a saved flow
- to replay.
- """
- )
# Proxy options
self.add_option(
@@ -396,13 +213,6 @@ class Options(optmanager.OptManager):
"""
)
self.add_option(
- "upstream_auth", Optional[str], None,
- """
- Add HTTP Basic authentication to upstream proxy and reverse proxy
- requests. Format: username:password.
- """
- )
- self.add_option(
"ssl_version_client", str, "secure",
"""
Set supported SSL/TLS versions for client connections. SSLv2, SSLv3
diff --git a/mitmproxy/optmanager.py b/mitmproxy/optmanager.py
index 01d97af3..bb9e3030 100644
--- a/mitmproxy/optmanager.py
+++ b/mitmproxy/optmanager.py
@@ -327,6 +327,13 @@ class OptManager:
return d
def make_parser(self, parser, optname, metavar=None, short=None):
+ """
+ Auto-Create a command-line parser entry for a named option. If the
+ option does not exist, it is ignored.
+ """
+ if optname not in self._options:
+ return
+
o = self._options[optname]
def mkf(l, s):
diff --git a/mitmproxy/test/taddons.py b/mitmproxy/test/taddons.py
index d966f1d5..5930e414 100644
--- a/mitmproxy/test/taddons.py
+++ b/mitmproxy/test/taddons.py
@@ -59,14 +59,17 @@ class context:
provides a number of helper methods for common testing scenarios.
"""
- def __init__(self, master=None, options=None):
+ def __init__(self, *addons, options=None):
options = options or mitmproxy.options.Options()
- self.master = master or RecordingMaster(
+ self.master = RecordingMaster(
options
)
self.options = self.master.options
self.wrapped = None
+ for a in addons:
+ self.master.addons.add(a)
+
def ctx(self):
"""
Returns a new handler context.
diff --git a/test/helper_tools/dumperview.py b/test/helper_tools/dumperview.py
index d417d767..e17dc77b 100755
--- a/test/helper_tools/dumperview.py
+++ b/test/helper_tools/dumperview.py
@@ -4,12 +4,11 @@ import click
from mitmproxy.addons import dumper
from mitmproxy.test import tflow
from mitmproxy.test import taddons
-from mitmproxy.tools import options
def show(flow_detail, flows):
d = dumper.Dumper()
- with taddons.context(options=options.Options()) as ctx:
+ with taddons.context() as ctx:
ctx.configure(d, flow_detail=flow_detail)
for f in flows:
ctx.cycle(d, f)
diff --git a/test/mitmproxy/addons/test_allowremote.py b/test/mitmproxy/addons/test_allowremote.py
index 9fc71525..52dae68d 100644
--- a/test/mitmproxy/addons/test_allowremote.py
+++ b/test/mitmproxy/addons/test_allowremote.py
@@ -19,8 +19,7 @@ from mitmproxy.test import taddons
])
def test_allowremote(allow_remote, ip, should_be_killed):
ar = allowremote.AllowRemote()
- with taddons.context() as tctx:
- tctx.master.addons.register(ar)
+ with taddons.context(ar) as tctx:
tctx.options.allow_remote = allow_remote
with mock.patch('mitmproxy.proxy.protocol.base.Layer') as layer:
diff --git a/test/mitmproxy/addons/test_anticache.py b/test/mitmproxy/addons/test_anticache.py
index 928f2180..d1765fe0 100644
--- a/test/mitmproxy/addons/test_anticache.py
+++ b/test/mitmproxy/addons/test_anticache.py
@@ -7,7 +7,7 @@ from mitmproxy.test import taddons
class TestAntiCache:
def test_simple(self):
sa = anticache.AntiCache()
- with taddons.context() as tctx:
+ with taddons.context(sa) as tctx:
f = tflow.tflow(resp=True)
f.request.headers["if-modified-since"] = "test"
f.request.headers["if-none-match"] = "test"
diff --git a/test/mitmproxy/addons/test_anticomp.py b/test/mitmproxy/addons/test_anticomp.py
index 2a6cf3ce..92650332 100644
--- a/test/mitmproxy/addons/test_anticomp.py
+++ b/test/mitmproxy/addons/test_anticomp.py
@@ -7,7 +7,7 @@ from mitmproxy.test import taddons
class TestAntiComp:
def test_simple(self):
sa = anticomp.AntiComp()
- with taddons.context() as tctx:
+ with taddons.context(sa) as tctx:
f = tflow.tflow(resp=True)
sa.request(f)
diff --git a/test/mitmproxy/addons/test_clientplayback.py b/test/mitmproxy/addons/test_clientplayback.py
index 3f990668..f172af83 100644
--- a/test/mitmproxy/addons/test_clientplayback.py
+++ b/test/mitmproxy/addons/test_clientplayback.py
@@ -24,7 +24,7 @@ class MockThread():
class TestClientPlayback:
def test_playback(self):
cp = clientplayback.ClientPlayback()
- with taddons.context() as tctx:
+ with taddons.context(cp) as tctx:
assert cp.count() == 0
f = tflow.tflow(resp=True)
cp.start_replay([f])
@@ -58,7 +58,7 @@ class TestClientPlayback:
def test_load_file(self, tmpdir):
cp = clientplayback.ClientPlayback()
- with taddons.context():
+ with taddons.context(cp):
fpath = str(tmpdir.join("flows"))
tdump(fpath, [tflow.tflow(resp=True)])
cp.load_file(fpath)
@@ -68,7 +68,7 @@ class TestClientPlayback:
def test_configure(self, tmpdir):
cp = clientplayback.ClientPlayback()
- with taddons.context() as tctx:
+ with taddons.context(cp) as tctx:
path = str(tmpdir.join("flows"))
tdump(path, [tflow.tflow()])
tctx.configure(cp, client_replay=[path])
diff --git a/test/mitmproxy/addons/test_core.py b/test/mitmproxy/addons/test_core.py
index 5aa4ef37..3f95bed4 100644
--- a/test/mitmproxy/addons/test_core.py
+++ b/test/mitmproxy/addons/test_core.py
@@ -10,9 +10,9 @@ def test_set():
with taddons.context() as tctx:
tctx.master.addons.add(sa)
- assert not tctx.master.options.anticomp
- tctx.command(sa.set, "anticomp")
- assert tctx.master.options.anticomp
+ assert tctx.master.options.server
+ tctx.command(sa.set, "server=false")
+ assert not tctx.master.options.server
with pytest.raises(exceptions.CommandError):
tctx.command(sa.set, "nonexistent")
@@ -128,28 +128,23 @@ def test_options(tmpdir):
p = str(tmpdir.join("path"))
sa = core.Core()
with taddons.context() as tctx:
- tctx.options.stickycookie = "foo"
- assert tctx.options.stickycookie == "foo"
- sa.options_reset()
- assert tctx.options.stickycookie is None
-
- tctx.options.stickycookie = "foo"
- tctx.options.stickyauth = "bar"
- sa.options_reset_one("stickycookie")
- assert tctx.options.stickycookie is None
- assert tctx.options.stickyauth == "bar"
+ tctx.options.listen_host = "foo"
+ assert tctx.options.listen_host == "foo"
+ sa.options_reset_one("listen_host")
+ assert tctx.options.listen_host != "foo"
with pytest.raises(exceptions.CommandError):
sa.options_reset_one("unknown")
+ tctx.options.listen_host = "foo"
sa.options_save(p)
with pytest.raises(exceptions.CommandError):
sa.options_save("/")
sa.options_reset()
- assert tctx.options.stickyauth is None
+ assert tctx.options.listen_host == ""
sa.options_load(p)
- assert tctx.options.stickyauth == "bar"
+ assert tctx.options.listen_host == "foo"
sa.options_load("/nonexistent")
diff --git a/test/mitmproxy/addons/test_dumper.py b/test/mitmproxy/addons/test_dumper.py
index fb80f3ce..9774e131 100644
--- a/test/mitmproxy/addons/test_dumper.py
+++ b/test/mitmproxy/addons/test_dumper.py
@@ -10,12 +10,11 @@ from mitmproxy.test import tutils
from mitmproxy.addons import dumper
from mitmproxy import exceptions
from mitmproxy import http
-from mitmproxy import options
def test_configure():
d = dumper.Dumper()
- with taddons.context(options=options.Options()) as ctx:
+ with taddons.context() as ctx:
ctx.configure(d, view_filter="~b foo")
assert d.filter
@@ -34,7 +33,7 @@ def test_configure():
def test_simple():
sio = io.StringIO()
d = dumper.Dumper(sio)
- with taddons.context(options=options.Options()) as ctx:
+ with taddons.context() as ctx:
ctx.configure(d, flow_detail=0)
d.response(tflow.tflow(resp=True))
assert not sio.getvalue()
@@ -102,7 +101,7 @@ def test_echo_body():
sio = io.StringIO()
d = dumper.Dumper(sio)
- with taddons.context(options=options.Options()) as ctx:
+ with taddons.context() as ctx:
ctx.configure(d, flow_detail=3)
d._echo_message(f.response)
t = sio.getvalue()
@@ -112,7 +111,7 @@ def test_echo_body():
def test_echo_request_line():
sio = io.StringIO()
d = dumper.Dumper(sio)
- with taddons.context(options=options.Options()) as ctx:
+ with taddons.context() as ctx:
ctx.configure(d, flow_detail=3, showhost=True)
f = tflow.tflow(client_conn=None, server_conn=True, resp=True)
f.request.is_replay = True
@@ -147,7 +146,7 @@ class TestContentView:
view_auto.side_effect = exceptions.ContentViewException("")
sio = io.StringIO()
d = dumper.Dumper(sio)
- with taddons.context(options=options.Options()) as ctx:
+ with taddons.context() as ctx:
ctx.configure(d, flow_detail=4, verbosity='debug')
d.response(tflow.tflow())
assert ctx.master.has_log("content viewer failed")
@@ -156,7 +155,7 @@ class TestContentView:
def test_tcp():
sio = io.StringIO()
d = dumper.Dumper(sio)
- with taddons.context(options=options.Options()) as ctx:
+ with taddons.context() as ctx:
ctx.configure(d, flow_detail=3, showhost=True)
f = tflow.ttcpflow()
d.tcp_message(f)
@@ -171,7 +170,7 @@ def test_tcp():
def test_websocket():
sio = io.StringIO()
d = dumper.Dumper(sio)
- with taddons.context(options=options.Options()) as ctx:
+ with taddons.context() as ctx:
ctx.configure(d, flow_detail=3, showhost=True)
f = tflow.twebsocketflow()
d.websocket_message(f)
diff --git a/test/mitmproxy/addons/test_intercept.py b/test/mitmproxy/addons/test_intercept.py
index d4999eb5..d9598101 100644
--- a/test/mitmproxy/addons/test_intercept.py
+++ b/test/mitmproxy/addons/test_intercept.py
@@ -1,7 +1,6 @@
import pytest
from mitmproxy.addons import intercept
-from mitmproxy import options
from mitmproxy import exceptions
from mitmproxy.test import taddons
from mitmproxy.test import tflow
@@ -9,7 +8,7 @@ from mitmproxy.test import tflow
def test_simple():
r = intercept.Intercept()
- with taddons.context(options=options.Options()) as tctx:
+ with taddons.context() as tctx:
assert not r.filt
tctx.configure(r, intercept="~q")
assert r.filt
diff --git a/test/mitmproxy/addons/test_keepserving.py b/test/mitmproxy/addons/test_keepserving.py
index 70f7e1e6..2869d097 100644
--- a/test/mitmproxy/addons/test_keepserving.py
+++ b/test/mitmproxy/addons/test_keepserving.py
@@ -4,7 +4,6 @@ from mitmproxy.test import taddons
def test_keepserving():
ks = keepserving.KeepServing()
-
- with taddons.context() as tctx:
+ with taddons.context(ks) as tctx:
ks.event_processing_complete()
assert tctx.master.should_exit.is_set()
diff --git a/test/mitmproxy/addons/test_onboarding.py b/test/mitmproxy/addons/test_onboarding.py
index 474e6c3c..810ddef1 100644
--- a/test/mitmproxy/addons/test_onboarding.py
+++ b/test/mitmproxy/addons/test_onboarding.py
@@ -2,7 +2,6 @@ import pytest
from mitmproxy.addons import onboarding
from mitmproxy.test import taddons
-from mitmproxy import options
from .. import tservers
@@ -11,25 +10,28 @@ class TestApp(tservers.HTTPProxyTest):
return [onboarding.Onboarding()]
def test_basic(self):
- with taddons.context() as tctx:
- tctx.configure(self.addons()[0])
+ ob = onboarding.Onboarding()
+ with taddons.context(ob) as tctx:
+ tctx.configure(ob)
assert self.app("/").status_code == 200
@pytest.mark.parametrize("ext", ["pem", "p12"])
def test_cert(self, ext):
- with taddons.context() as tctx:
- tctx.configure(self.addons()[0])
+ ob = onboarding.Onboarding()
+ with taddons.context(ob) as tctx:
+ tctx.configure(ob)
resp = self.app("/cert/%s" % ext)
assert resp.status_code == 200
assert resp.content
@pytest.mark.parametrize("ext", ["pem", "p12"])
def test_head(self, ext):
- with taddons.context() as tctx:
- tctx.configure(self.addons()[0])
+ ob = onboarding.Onboarding()
+ with taddons.context(ob) as tctx:
+ tctx.configure(ob)
p = self.pathoc()
with p.connect():
- resp = p.request("head:'http://%s/cert/%s'" % (options.APP_HOST, ext))
+ resp = p.request("head:'http://%s/cert/%s'" % (tctx.options.onboarding_host, ext))
assert resp.status_code == 200
assert "Content-Length" in resp.headers
assert not resp.content
diff --git a/test/mitmproxy/addons/test_readfile.py b/test/mitmproxy/addons/test_readfile.py
index 813aa10e..0439862a 100644
--- a/test/mitmproxy/addons/test_readfile.py
+++ b/test/mitmproxy/addons/test_readfile.py
@@ -41,7 +41,7 @@ class TestReadFile:
@mock.patch('mitmproxy.master.Master.load_flow')
def test_configure(self, mck, tmpdir, data, corrupt_data):
rf = readfile.ReadFile()
- with taddons.context() as tctx:
+ with taddons.context(rf) as tctx:
tf = tmpdir.join("tfile")
tf.write(data.getvalue())
@@ -58,7 +58,7 @@ class TestReadFile:
@mock.patch('mitmproxy.master.Master.load_flow')
def test_corrupt(self, mck, corrupt_data):
rf = readfile.ReadFile()
- with taddons.context() as tctx:
+ with taddons.context(rf) as tctx:
with pytest.raises(exceptions.FlowReadException):
rf.load_flows(io.BytesIO(b"qibble"))
assert not mck.called
@@ -71,7 +71,7 @@ class TestReadFile:
def test_nonexisting_file(self):
rf = readfile.ReadFile()
- with taddons.context() as tctx:
+ with taddons.context(rf) as tctx:
with pytest.raises(exceptions.FlowReadException):
rf.load_flows_from_path("nonexistent")
assert len(tctx.master.logs) == 1
@@ -82,7 +82,7 @@ class TestReadFileStdin:
@mock.patch('sys.stdin')
def test_stdin(self, stdin, load_flow, data, corrupt_data):
rf = readfile.ReadFileStdin()
- with taddons.context() as tctx:
+ with taddons.context(rf) as tctx:
stdin.buffer = data
tctx.configure(rf, rfile="-")
assert not load_flow.called
@@ -97,7 +97,7 @@ class TestReadFileStdin:
@mock.patch('mitmproxy.master.Master.load_flow')
def test_normal(self, load_flow, tmpdir, data):
rf = readfile.ReadFileStdin()
- with taddons.context():
+ with taddons.context(rf):
tfile = tmpdir.join("tfile")
tfile.write(data.getvalue())
rf.load_flows_from_path(str(tfile))
diff --git a/test/mitmproxy/addons/test_replace.py b/test/mitmproxy/addons/test_replace.py
index 9002afb5..9c1f7f79 100644
--- a/test/mitmproxy/addons/test_replace.py
+++ b/test/mitmproxy/addons/test_replace.py
@@ -18,7 +18,7 @@ class TestReplace:
def test_configure(self):
r = replace.Replace()
- with taddons.context() as tctx:
+ with taddons.context(r) as tctx:
tctx.configure(r, replacements=["one/two/three"])
with pytest.raises(Exception, match="Invalid filter pattern"):
tctx.configure(r, replacements=["/~b/two/three"])
@@ -28,7 +28,7 @@ class TestReplace:
def test_simple(self):
r = replace.Replace()
- with taddons.context() as tctx:
+ with taddons.context(r) as tctx:
tctx.configure(
r,
replacements=[
@@ -48,7 +48,7 @@ class TestReplace:
def test_order(self):
r = replace.Replace()
- with taddons.context() as tctx:
+ with taddons.context(r) as tctx:
tctx.configure(
r,
replacements=[
@@ -67,7 +67,7 @@ class TestReplace:
class TestReplaceFile:
def test_simple(self, tmpdir):
r = replace.Replace()
- with taddons.context() as tctx:
+ with taddons.context(r) as tctx:
tmpfile = tmpdir.join("replacement")
tmpfile.write("bar")
tctx.configure(
@@ -81,7 +81,7 @@ class TestReplaceFile:
def test_nonexistent(self, tmpdir):
r = replace.Replace()
- with taddons.context() as tctx:
+ with taddons.context(r) as tctx:
with pytest.raises(Exception, match="Invalid file path"):
tctx.configure(
r,
diff --git a/test/mitmproxy/addons/test_save.py b/test/mitmproxy/addons/test_save.py
index 2dee708f..4486ff78 100644
--- a/test/mitmproxy/addons/test_save.py
+++ b/test/mitmproxy/addons/test_save.py
@@ -5,14 +5,13 @@ from mitmproxy.test import tflow
from mitmproxy import io
from mitmproxy import exceptions
-from mitmproxy import options
from mitmproxy.addons import save
from mitmproxy.addons import view
def test_configure(tmpdir):
sa = save.Save()
- with taddons.context(options=options.Options()) as tctx:
+ with taddons.context() as tctx:
with pytest.raises(exceptions.OptionsError):
tctx.configure(sa, save_stream_file=str(tmpdir))
with pytest.raises(Exception, match="Invalid filter"):
diff --git a/test/mitmproxy/addons/test_script.py b/test/mitmproxy/addons/test_script.py
index 78a5be6c..73641d24 100644
--- a/test/mitmproxy/addons/test_script.py
+++ b/test/mitmproxy/addons/test_script.py
@@ -171,7 +171,7 @@ class TestScriptLoader:
"mitmproxy/data/addonscripts/recorder/recorder.py"
)
sc = script.ScriptLoader()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
sc.script_run([tflow.tflow(resp=True)], rp)
debug = [i.msg for i in tctx.master.logs if i.level == "debug"]
assert debug == [
@@ -183,7 +183,7 @@ class TestScriptLoader:
def test_script_run_nonexistent(self):
sc = script.ScriptLoader()
- with taddons.context():
+ with taddons.context(sc):
with pytest.raises(exceptions.CommandError):
sc.script_run([tflow.tflow(resp=True)], "/")
@@ -208,8 +208,7 @@ class TestScriptLoader:
def test_dupes(self):
sc = script.ScriptLoader()
- with taddons.context() as tctx:
- tctx.master.addons.add(sc)
+ with taddons.context(sc) as tctx:
with pytest.raises(exceptions.OptionsError):
tctx.configure(
sc,
@@ -232,7 +231,7 @@ class TestScriptLoader:
def test_load_err(self):
sc = script.ScriptLoader()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
tctx.configure(sc, scripts=[
tutils.test_data.path("mitmproxy/data/addonscripts/load_error.py")
])
@@ -242,7 +241,7 @@ class TestScriptLoader:
pass # this is expected and normally guarded.
# on the next tick we should not fail however.
tctx.invoke(sc, "tick")
- assert len(tctx.master.addons) == 0
+ assert len(tctx.master.addons) == 1
def test_order(self):
rec = tutils.test_data.path("mitmproxy/data/addonscripts/recorder")
diff --git a/test/mitmproxy/addons/test_serverplayback.py b/test/mitmproxy/addons/test_serverplayback.py
index 32249a88..0bc28ac8 100644
--- a/test/mitmproxy/addons/test_serverplayback.py
+++ b/test/mitmproxy/addons/test_serverplayback.py
@@ -19,7 +19,7 @@ def tdump(path, flows):
def test_load_file(tmpdir):
s = serverplayback.ServerPlayback()
- with taddons.context():
+ with taddons.context(s):
fpath = str(tmpdir.join("flows"))
tdump(fpath, [tflow.tflow(resp=True)])
s.load_file(fpath)
@@ -30,7 +30,7 @@ def test_load_file(tmpdir):
def test_config(tmpdir):
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
fpath = str(tmpdir.join("flows"))
tdump(fpath, [tflow.tflow(resp=True)])
tctx.configure(s, server_replay=[fpath])
@@ -41,7 +41,7 @@ def test_config(tmpdir):
def test_tick():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
s.stop = True
s.final_flow = tflow.tflow()
s.final_flow.live = False
@@ -51,7 +51,7 @@ def test_tick():
def test_server_playback():
sp = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(sp) as tctx:
tctx.configure(sp)
f = tflow.tflow(resp=True)
@@ -70,7 +70,7 @@ def test_server_playback():
def test_ignore_host():
sp = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(sp) as tctx:
tctx.configure(sp, server_replay_ignore_host=True)
r = tflow.tflow(resp=True)
@@ -85,7 +85,7 @@ def test_ignore_host():
def test_ignore_content():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(s, server_replay_ignore_content=False)
r = tflow.tflow(resp=True)
@@ -113,7 +113,7 @@ def test_ignore_content():
def test_ignore_content_wins_over_params():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(
s,
server_replay_ignore_content=True,
@@ -137,7 +137,7 @@ def test_ignore_content_wins_over_params():
def test_ignore_payload_params_other_content_type():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(
s,
server_replay_ignore_content=False,
@@ -161,7 +161,7 @@ def test_ignore_payload_params_other_content_type():
def test_hash():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(s)
r = tflow.tflow()
@@ -181,7 +181,7 @@ def test_hash():
def test_headers():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(s, server_replay_use_headers=["foo"])
r = tflow.tflow(resp=True)
@@ -200,7 +200,7 @@ def test_headers():
def test_load():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(s)
r = tflow.tflow(resp=True)
@@ -227,7 +227,7 @@ def test_load():
def test_load_with_server_replay_nopop():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(s, server_replay_nopop=True)
r = tflow.tflow(resp=True)
@@ -245,7 +245,7 @@ def test_load_with_server_replay_nopop():
def test_ignore_params():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(
s,
server_replay_ignore_params=["param1", "param2"]
@@ -266,7 +266,7 @@ def test_ignore_params():
def thash(r, r2, setter):
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
s = serverplayback.ServerPlayback()
tctx.configure(
s,
@@ -328,7 +328,7 @@ def test_ignore_payload_params():
def test_server_playback_full():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(
s,
server_replay_refresh = True,
@@ -360,7 +360,7 @@ def test_server_playback_full():
def test_server_playback_kill():
s = serverplayback.ServerPlayback()
- with taddons.context() as tctx:
+ with taddons.context(s) as tctx:
tctx.configure(
s,
server_replay_refresh = True,
diff --git a/test/mitmproxy/addons/test_setheaders.py b/test/mitmproxy/addons/test_setheaders.py
index 3aaee7f4..2d5e9e3c 100644
--- a/test/mitmproxy/addons/test_setheaders.py
+++ b/test/mitmproxy/addons/test_setheaders.py
@@ -19,14 +19,14 @@ class TestSetHeaders:
def test_configure(self):
sh = setheaders.SetHeaders()
- with taddons.context() as tctx:
+ with taddons.context(sh) as tctx:
with pytest.raises(Exception, match="Invalid setheader filter pattern"):
tctx.configure(sh, setheaders = ["/~b/one/two"])
tctx.configure(sh, setheaders = ["/foo/bar/voing"])
def test_setheaders(self):
sh = setheaders.SetHeaders()
- with taddons.context() as tctx:
+ with taddons.context(sh) as tctx:
tctx.configure(
sh,
setheaders = [
diff --git a/test/mitmproxy/addons/test_stickyauth.py b/test/mitmproxy/addons/test_stickyauth.py
index ef7d0793..7b422fdd 100644
--- a/test/mitmproxy/addons/test_stickyauth.py
+++ b/test/mitmproxy/addons/test_stickyauth.py
@@ -9,7 +9,7 @@ from mitmproxy import exceptions
def test_configure():
r = stickyauth.StickyAuth()
- with taddons.context() as tctx:
+ with taddons.context(r) as tctx:
tctx.configure(r, stickyauth="~s")
with pytest.raises(exceptions.OptionsError):
tctx.configure(r, stickyauth="~~")
@@ -20,7 +20,7 @@ def test_configure():
def test_simple():
r = stickyauth.StickyAuth()
- with taddons.context() as tctx:
+ with taddons.context(r) as tctx:
tctx.configure(r, stickyauth=".*")
f = tflow.tflow(resp=True)
f.request.headers["authorization"] = "foo"
diff --git a/test/mitmproxy/addons/test_stickycookie.py b/test/mitmproxy/addons/test_stickycookie.py
index f77d019d..4493e9cc 100644
--- a/test/mitmproxy/addons/test_stickycookie.py
+++ b/test/mitmproxy/addons/test_stickycookie.py
@@ -15,7 +15,7 @@ def test_domain_match():
class TestStickyCookie:
def test_config(self):
sc = stickycookie.StickyCookie()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
with pytest.raises(Exception, match="invalid filter"):
tctx.configure(sc, stickycookie="~b")
@@ -26,7 +26,7 @@ class TestStickyCookie:
def test_simple(self):
sc = stickycookie.StickyCookie()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
tctx.configure(sc, stickycookie=".*")
f = tflow.tflow(resp=True)
f.response.headers["set-cookie"] = "foo=bar"
@@ -50,7 +50,7 @@ class TestStickyCookie:
def test_response(self):
sc = stickycookie.StickyCookie()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
tctx.configure(sc, stickycookie=".*")
c = "SSID=mooo; domain=.google.com, FOO=bar; Domain=.google.com; Path=/; " \
@@ -68,7 +68,7 @@ class TestStickyCookie:
def test_response_multiple(self):
sc = stickycookie.StickyCookie()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
tctx.configure(sc, stickycookie=".*")
# Test setting of multiple cookies
@@ -82,7 +82,7 @@ class TestStickyCookie:
def test_response_weird(self):
sc = stickycookie.StickyCookie()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
tctx.configure(sc, stickycookie=".*")
# Test setting of weird cookie keys
@@ -100,7 +100,7 @@ class TestStickyCookie:
def test_response_overwrite(self):
sc = stickycookie.StickyCookie()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
tctx.configure(sc, stickycookie=".*")
# Test overwriting of a cookie value
@@ -115,7 +115,7 @@ class TestStickyCookie:
def test_response_delete(self):
sc = stickycookie.StickyCookie()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
tctx.configure(sc, stickycookie=".*")
# Test that a cookie is be deleted
@@ -127,7 +127,7 @@ class TestStickyCookie:
def test_request(self):
sc = stickycookie.StickyCookie()
- with taddons.context() as tctx:
+ with taddons.context(sc) as tctx:
tctx.configure(sc, stickycookie=".*")
f = self._response(sc, "SSID=mooo", "www.google.com")
diff --git a/test/mitmproxy/addons/test_streambodies.py b/test/mitmproxy/addons/test_streambodies.py
index 426ec9ae..b980ea0b 100644
--- a/test/mitmproxy/addons/test_streambodies.py
+++ b/test/mitmproxy/addons/test_streambodies.py
@@ -7,7 +7,7 @@ import pytest
def test_simple():
sa = streambodies.StreamBodies()
- with taddons.context() as tctx:
+ with taddons.context(sa) as tctx:
with pytest.raises(exceptions.OptionsError):
tctx.configure(sa, stream_large_bodies = "invalid")
tctx.configure(sa, stream_large_bodies = "10")
diff --git a/test/mitmproxy/addons/test_upstream_auth.py b/test/mitmproxy/addons/test_upstream_auth.py
index c7342bb5..53b342a2 100644
--- a/test/mitmproxy/addons/test_upstream_auth.py
+++ b/test/mitmproxy/addons/test_upstream_auth.py
@@ -9,7 +9,7 @@ from mitmproxy.addons import upstream_auth
def test_configure():
up = upstream_auth.UpstreamAuth()
- with taddons.context() as tctx:
+ with taddons.context(up) as tctx:
tctx.configure(up, upstream_auth="test:test")
assert up.auth == b"Basic" + b" " + base64.b64encode(b"test:test")
@@ -29,7 +29,7 @@ def test_configure():
def test_simple():
up = upstream_auth.UpstreamAuth()
- with taddons.context() as tctx:
+ with taddons.context(up) as tctx:
tctx.configure(up, upstream_auth="foo:bar")
f = tflow.tflow()
diff --git a/test/mitmproxy/test_optmanager.py b/test/mitmproxy/test_optmanager.py
index d9b93227..1c49c0b8 100644
--- a/test/mitmproxy/test_optmanager.py
+++ b/test/mitmproxy/test_optmanager.py
@@ -351,7 +351,7 @@ def test_dump_defaults():
def test_dump_dicts():
o = options.Options()
assert optmanager.dump_dicts(o)
- assert optmanager.dump_dicts(o, ['http2', 'anticomp'])
+ assert optmanager.dump_dicts(o, ['http2', 'listen_port'])
class TTypes(optmanager.OptManager):
@@ -375,9 +375,13 @@ def test_make_parser():
opts.make_parser(parser, "int", short="c")
opts.make_parser(parser, "seqstr", short="d")
opts.make_parser(parser, "bool_on", short="e")
+
with pytest.raises(ValueError):
opts.make_parser(parser, "unknown")
+ # Nonexistent options ignore
+ opts.make_parser(parser, "nonexistentxxx")
+
def test_set():
opts = TTypes()
diff --git a/test/mitmproxy/tools/console/test_master.py b/test/mitmproxy/tools/console/test_master.py
index 6f46ce9e..6ea61991 100644
--- a/test/mitmproxy/tools/console/test_master.py
+++ b/test/mitmproxy/tools/console/test_master.py
@@ -7,10 +7,6 @@ from mitmproxy.tools import console
from ... import tservers
-def test_options():
- assert options.Options(server_replay_kill_extra=True)
-
-
class TestMaster(tservers.MasterTest):
def mkmaster(self, **opts):
if "verbosity" not in opts:
diff --git a/test/mitmproxy/tools/console/test_statusbar.py b/test/mitmproxy/tools/console/test_statusbar.py
index 8522eb96..ac17c5c0 100644
--- a/test/mitmproxy/tools/console/test_statusbar.py
+++ b/test/mitmproxy/tools/console/test_statusbar.py
@@ -3,7 +3,9 @@ from mitmproxy.tools.console import statusbar, master
def test_statusbar(monkeypatch):
- o = options.Options(
+ o = options.Options()
+ m = master.ConsoleMaster(o)
+ m.options.update(
setheaders=[":~q:foo:bar"],
replacements=[":~q:foo:bar"],
ignore_hosts=["example.com", "example.org"],
@@ -21,10 +23,8 @@ def test_statusbar(monkeypatch):
upstream_cert=False,
stream_large_bodies="3m",
mode="transparent",
- scripts=["nonexistent"],
- save_stream_file="foo",
)
- m = master.ConsoleMaster(o)
+
m.options.update(view_order='url', console_focus_follow=True)
monkeypatch.setattr(m.addons.get("clientplayback"), "count", lambda: 42)
monkeypatch.setattr(m.addons.get("serverplayback"), "count", lambda: 42)
diff --git a/test/mitmproxy/tools/web/test_static_viewer.py b/test/mitmproxy/tools/web/test_static_viewer.py
index cfe6cd7f..dfc45bc2 100644
--- a/test/mitmproxy/tools/web/test_static_viewer.py
+++ b/test/mitmproxy/tools/web/test_static_viewer.py
@@ -8,7 +8,7 @@ from mitmproxy import flowfilter
from mitmproxy.tools.web.app import flow_to_json
from mitmproxy.tools.web import static_viewer
-from mitmproxy.addons import save
+from mitmproxy.addons import save, readfile
def test_save_static(tmpdir):
@@ -59,8 +59,9 @@ def test_save_flows_content(ctx, tmpdir):
def test_static_viewer(tmpdir):
s = static_viewer.StaticViewer()
+ rf = readfile.ReadFile()
sa = save.Save()
- with taddons.context() as tctx:
+ with taddons.context(rf) as tctx:
sa.save([tflow.tflow(resp=True)], str(tmpdir.join('foo')))
tctx.master.addons.add(s)
tctx.configure(s, web_static_viewer=str(tmpdir), rfile=str(tmpdir.join('foo')))
diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py
index dd5bb327..4363931f 100644
--- a/test/mitmproxy/tservers.py
+++ b/test/mitmproxy/tservers.py
@@ -222,12 +222,12 @@ class HTTPProxyTest(ProxyTestBase):
p = pathod.pathoc.Pathoc(
("127.0.0.1", self.proxy.port), True, fp=None
)
- with p.connect((options.APP_HOST, options.APP_PORT)):
+ with p.connect((self.master.options.onboarding_host, self.master.options.onbarding_port)):
return p.request("get:'%s'" % page)
else:
p = self.pathoc()
with p.connect():
- return p.request("get:'http://%s%s'" % (options.APP_HOST, page))
+ return p.request("get:'http://%s%s'" % (self.master.options.onboarding_host, page))
class TransparentProxyTest(ProxyTestBase):