aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/tools
diff options
context:
space:
mode:
Diffstat (limited to 'mitmproxy/tools')
-rw-r--r--mitmproxy/tools/cmdline.py169
-rw-r--r--mitmproxy/tools/console/master.py44
-rw-r--r--mitmproxy/tools/console/options.py58
-rw-r--r--mitmproxy/tools/console/palettepicker.py21
-rw-r--r--mitmproxy/tools/dump.py15
-rw-r--r--mitmproxy/tools/main.py67
-rw-r--r--mitmproxy/tools/web/master.py23
7 files changed, 160 insertions, 237 deletions
diff --git a/mitmproxy/tools/cmdline.py b/mitmproxy/tools/cmdline.py
index f8246199..925491d7 100644
--- a/mitmproxy/tools/cmdline.py
+++ b/mitmproxy/tools/cmdline.py
@@ -1,6 +1,7 @@
-import configargparse
-import os
+import argparse
import re
+import os
+
from mitmproxy import exceptions
from mitmproxy import flowfilter
from mitmproxy import options
@@ -11,6 +12,9 @@ from mitmproxy import version
from mitmproxy.addons import view
+CONFIG_PATH = os.path.join(options.CA_DIR, "config.yaml")
+
+
class ParseException(Exception):
pass
@@ -113,13 +117,13 @@ def get_common_options(args):
stream_large_bodies = human.parse_size(stream_large_bodies)
reps = []
- for i in args.replace:
+ for i in args.replace or []:
try:
p = parse_replace_hook(i)
except ParseException as e:
raise exceptions.OptionsError(e)
reps.append(p)
- for i in args.replace_file:
+ for i in args.replace_file or []:
try:
patt, rex, path = parse_replace_hook(i)
except ParseException as e:
@@ -133,7 +137,7 @@ def get_common_options(args):
reps.append((patt, rex, v))
setheaders = []
- for i in args.setheader:
+ for i in args.setheader or []:
try:
p = parse_setheader(i)
except ParseException as e:
@@ -154,7 +158,7 @@ def get_common_options(args):
# Proxy config
certs = []
- for i in args.certs:
+ for i in args.certs or []:
parts = i.split("=", 1)
if len(parts) == 1:
parts = ["*", parts[0]]
@@ -287,8 +291,7 @@ def basic_options(parser):
)
parser.add_argument(
"--anticache",
- action="store_true", dest="anticache", default=False,
-
+ action="store_true", dest="anticache",
help="""
Strip out request headers that might cause the server to return
304-not-modified.
@@ -296,12 +299,12 @@ def basic_options(parser):
)
parser.add_argument(
"--cadir",
- action="store", type=str, dest="cadir", default=options.CA_DIR,
+ action="store", type=str, dest="cadir",
help="Location of the default mitmproxy CA files. (%s)" % options.CA_DIR
)
parser.add_argument(
"--host",
- action="store_true", dest="showhost", default=False,
+ action="store_true", dest="showhost",
help="Use the Host header to construct URLs for display."
)
parser.add_argument(
@@ -311,12 +314,12 @@ def basic_options(parser):
)
parser.add_argument(
"-r", "--read-flows",
- action="store", dest="rfile", default=None,
+ action="store", dest="rfile",
help="Read flows from file."
)
parser.add_argument(
"-s", "--script",
- action="append", type=str, dest="scripts", default=[],
+ action="append", type=str, dest="scripts",
metavar='"script.py --bar"',
help="""
Run a script. Surround with quotes to pass script arguments. Can be
@@ -327,18 +330,17 @@ def basic_options(parser):
"-t", "--stickycookie",
action="store",
dest="stickycookie_filt",
- default=None,
metavar="FILTER",
help="Set sticky cookie filter. Matched against requests."
)
parser.add_argument(
"-u", "--stickyauth",
- action="store", dest="stickyauth_filt", default=None, metavar="FILTER",
+ action="store", dest="stickyauth_filt", metavar="FILTER",
help="Set sticky auth filter. Matched against requests."
)
parser.add_argument(
"-v", "--verbose",
- action="store_const", dest="verbose", default=2, const=3,
+ action="store_const", dest="verbose", const=3,
help="Increase log verbosity."
)
streamfile = parser.add_mutually_exclusive_group()
@@ -354,19 +356,19 @@ def basic_options(parser):
)
parser.add_argument(
"-z", "--anticomp",
- action="store_true", dest="anticomp", default=False,
+ action="store_true", dest="anticomp",
help="Try to convince servers to send us un-compressed data."
)
parser.add_argument(
"-Z", "--body-size-limit",
- action="store", dest="body_size_limit", default=None,
+ action="store", dest="body_size_limit",
metavar="SIZE",
help="Byte size limit of HTTP request and response bodies."
" Understands k/m/g suffixes, i.e. 3m for 3 megabytes."
)
parser.add_argument(
"--stream",
- action="store", dest="stream_large_bodies", default=None,
+ action="store", dest="stream_large_bodies",
metavar="SIZE",
help="""
Stream data to the client if response body exceeds the given
@@ -383,7 +385,6 @@ def proxy_modes(parser):
action="store",
type=str,
dest="reverse_proxy",
- default=None,
help="""
Forward all requests to upstream HTTP server:
http[s]://host[:port]. Clients can always connect both
@@ -393,12 +394,12 @@ def proxy_modes(parser):
)
group.add_argument(
"--socks",
- action="store_true", dest="socks_proxy", default=False,
+ action="store_true", dest="socks_proxy",
help="Set SOCKS5 proxy mode."
)
group.add_argument(
"-T", "--transparent",
- action="store_true", dest="transparent_proxy", default=False,
+ action="store_true", dest="transparent_proxy",
help="Set transparent proxy mode."
)
group.add_argument(
@@ -406,7 +407,6 @@ def proxy_modes(parser):
action="store",
type=str,
dest="upstream_proxy",
- default=None,
help="Forward all requests to upstream proxy server: http://host[:port]"
)
@@ -415,12 +415,12 @@ def proxy_options(parser):
group = parser.add_argument_group("Proxy Options")
group.add_argument(
"-b", "--bind-address",
- action="store", type=str, dest="addr", default='',
+ action="store", type=str, dest="addr",
help="Address to bind proxy to (defaults to all interfaces)"
)
group.add_argument(
"-I", "--ignore",
- action="append", type=str, dest="ignore_hosts", default=[],
+ action="append", type=str, dest="ignore_hosts",
metavar="HOST",
help="""
Ignore host and forward all traffic without processing it. In
@@ -433,7 +433,7 @@ def proxy_options(parser):
)
group.add_argument(
"--tcp",
- action="append", type=str, dest="tcp_hosts", default=[],
+ action="append", type=str, dest="tcp_hosts",
metavar="HOST",
help="""
Generic TCP SSL proxy mode for all hosts that match the pattern.
@@ -448,7 +448,7 @@ def proxy_options(parser):
)
group.add_argument(
"-p", "--port",
- action="store", type=int, dest="port", default=options.LISTEN_PORT,
+ action="store", type=int, dest="port",
help="Proxy service port."
)
group.add_argument(
@@ -467,7 +467,7 @@ def proxy_options(parser):
parser.add_argument(
"--upstream-auth",
- action="store", dest="upstream_auth", default=None,
+ action="store", dest="upstream_auth",
type=str,
help="""
Add HTTP Basic authentcation to upstream proxy and reverse proxy
@@ -491,7 +491,7 @@ def proxy_options(parser):
)
group.add_argument(
"--upstream-bind-address",
- action="store", type=str, dest="upstream_bind_address", default='',
+ action="store", type=str, dest="upstream_bind_address",
help="Address to bind upstream requests to (defaults to none)"
)
@@ -502,7 +502,6 @@ def proxy_ssl_options(parser):
group.add_argument(
"--cert",
dest='certs',
- default=[],
type=str,
metavar="SPEC",
action="append",
@@ -514,56 +513,56 @@ def proxy_ssl_options(parser):
'as the first entry. Can be passed multiple times.')
group.add_argument(
"--ciphers-client", action="store",
- type=str, dest="ciphers_client", default=options.DEFAULT_CLIENT_CIPHERS,
+ type=str, dest="ciphers_client",
help="Set supported ciphers for client connections. (OpenSSL Syntax)"
)
group.add_argument(
"--ciphers-server", action="store",
- type=str, dest="ciphers_server", default=None,
+ type=str, dest="ciphers_server",
help="Set supported ciphers for server connections. (OpenSSL Syntax)"
)
group.add_argument(
"--client-certs", action="store",
- type=str, dest="clientcerts", default=None,
+ type=str, dest="clientcerts",
help="Client certificate file or directory."
)
group.add_argument(
- "--no-upstream-cert", default=False,
+ "--no-upstream-cert",
action="store_true", dest="no_upstream_cert",
help="Don't connect to upstream server to look up certificate details."
)
group.add_argument(
- "--add-upstream-certs-to-client-chain", default=False,
+ "--add-upstream-certs-to-client-chain",
action="store_true", dest="add_upstream_certs_to_client_chain",
help="Add all certificates of the upstream server to the certificate chain "
"that will be served to the proxy client, as extras."
)
group.add_argument(
- "--insecure", default=False,
+ "--insecure",
action="store_true", dest="ssl_insecure",
help="Do not verify upstream server SSL/TLS certificates."
)
group.add_argument(
- "--upstream-trusted-cadir", default=None, action="store",
+ "--upstream-trusted-cadir", action="store",
dest="ssl_verify_upstream_trusted_cadir",
help="Path to a directory of trusted CA certificates for upstream "
"server verification prepared using the c_rehash tool."
)
group.add_argument(
- "--upstream-trusted-ca", default=None, action="store",
+ "--upstream-trusted-ca", action="store",
dest="ssl_verify_upstream_trusted_ca",
help="Path to a PEM formatted trusted CA certificate."
)
group.add_argument(
"--ssl-version-client", dest="ssl_version_client",
- default="secure", action="store",
+ action="store",
choices=tcp.sslversion_choices.keys(),
help="Set supported SSL/TLS versions for client connections. "
"SSLv2, SSLv3 and 'all' are INSECURE. Defaults to secure, which is TLS1.0+."
)
group.add_argument(
"--ssl-version-server", dest="ssl_version_server",
- default="secure", action="store",
+ action="store",
choices=tcp.sslversion_choices.keys(),
help="Set supported SSL/TLS versions for server connections. "
"SSLv2, SSLv3 and 'all' are INSECURE. Defaults to secure, which is TLS1.0+."
@@ -574,12 +573,12 @@ def onboarding_app(parser):
group = parser.add_argument_group("Onboarding App")
group.add_argument(
"--noapp",
- action="store_false", dest="app", default=True,
+ action="store_false", dest="app",
help="Disable the mitmproxy onboarding app."
)
group.add_argument(
"--app-host",
- action="store", dest="app_host", default=options.APP_HOST, metavar="host",
+ action="store", dest="app_host",
help="""
Domain to serve the onboarding app from. For transparent mode, use
an IP when a DNS entry for the app domain is not present. Default:
@@ -590,7 +589,6 @@ def onboarding_app(parser):
"--app-port",
action="store",
dest="app_port",
- default=options.APP_PORT,
type=int,
metavar="80",
help="Port to serve the onboarding app from."
@@ -601,7 +599,7 @@ def client_replay(parser):
group = parser.add_argument_group("Client Replay")
group.add_argument(
"-c", "--client-replay",
- action="append", dest="client_replay", default=[], metavar="PATH",
+ action="append", dest="client_replay", metavar="PATH",
help="Replay client requests from a saved file."
)
@@ -610,23 +608,23 @@ def server_replay(parser):
group = parser.add_argument_group("Server Replay")
group.add_argument(
"-S", "--server-replay",
- action="append", dest="server_replay", default=[], metavar="PATH",
+ action="append", dest="server_replay", metavar="PATH",
help="Replay server responses from a saved file."
)
group.add_argument(
"-k", "--replay-kill-extra",
- action="store_true", dest="replay_kill_extra", default=False,
+ action="store_true", dest="replay_kill_extra",
help="Kill extra requests during replay."
)
group.add_argument(
"--server-replay-use-header",
- action="append", dest="server_replay_use_headers", type=str, default=[],
+ action="append", dest="server_replay_use_headers", type=str,
help="Request headers to be considered during replay. "
"Can be passed multiple times."
)
group.add_argument(
"--norefresh",
- action="store_true", dest="norefresh", default=False,
+ action="store_true", dest="norefresh",
help="""
Disable response refresh, which updates times in cookies and headers
for replayed responses.
@@ -634,21 +632,21 @@ def server_replay(parser):
)
group.add_argument(
"--no-pop",
- action="store_true", dest="server_replay_nopop", default=False,
+ action="store_true", dest="server_replay_nopop",
help="Disable response pop from response flow. "
"This makes it possible to replay same response multiple times."
)
payload = group.add_mutually_exclusive_group()
payload.add_argument(
"--replay-ignore-content",
- action="store_true", dest="server_replay_ignore_content", default=False,
+ action="store_true", dest="server_replay_ignore_content",
help="""
Ignore request's content while searching for a saved flow to replay
"""
)
payload.add_argument(
"--replay-ignore-payload-param",
- action="append", dest="server_replay_ignore_payload_params", type=str, default=[],
+ action="append", dest="server_replay_ignore_payload_params", type=str,
help="""
Request's payload parameters (application/x-www-form-urlencoded or multipart/form-data) to
be ignored while searching for a saved flow to replay.
@@ -658,7 +656,7 @@ def server_replay(parser):
group.add_argument(
"--replay-ignore-param",
- action="append", dest="server_replay_ignore_params", type=str, default=[],
+ action="append", dest="server_replay_ignore_params", type=str,
help="""
Request's parameters to be ignored while searching for a saved flow
to replay. Can be passed multiple times.
@@ -668,7 +666,6 @@ def server_replay(parser):
"--replay-ignore-host",
action="store_true",
dest="server_replay_ignore_host",
- default=False,
help="Ignore request's destination host while searching for a saved flow to replay")
@@ -683,13 +680,13 @@ def replacements(parser):
)
group.add_argument(
"--replace",
- action="append", type=str, dest="replace", default=[],
+ action="append", type=str, dest="replace",
metavar="PATTERN",
help="Replacement pattern."
)
group.add_argument(
"--replace-from-file",
- action="append", type=str, dest="replace_file", default=[],
+ action="append", type=str, dest="replace_file",
metavar="PATH",
help="""
Replacement pattern, where the replacement clause is a path to a
@@ -709,7 +706,7 @@ def set_headers(parser):
)
group.add_argument(
"--setheader",
- action="append", type=str, dest="setheader", default=[],
+ action="append", type=str, dest="setheader",
metavar="PATTERN",
help="Header set pattern."
)
@@ -747,6 +744,15 @@ def proxy_authentication(parser):
def common_options(parser):
+ parser.add_argument(
+ "--conf",
+ type=str, dest="conf", default=CONFIG_PATH,
+ metavar="PATH",
+ help="""
+ Configuration file
+ """
+ )
+
basic_options(parser)
proxy_modes(parser)
proxy_options(parser)
@@ -764,26 +770,17 @@ def mitmproxy():
# platforms.
from .console import palettes
- parser = configargparse.ArgumentParser(
- usage="%(prog)s [options]",
- args_for_setting_config_path=["--conf"],
- default_config_files=[
- os.path.join(options.CA_DIR, "common.conf"),
- os.path.join(options.CA_DIR, "mitmproxy.conf")
- ],
- add_config_file_help=True,
- add_env_var_help=True
- )
+ parser = argparse.ArgumentParser(usage="%(prog)s [options]")
common_options(parser)
parser.add_argument(
- "--palette", type=str, default=palettes.DEFAULT,
+ "--palette", type=str,
action="store", dest="palette",
choices=sorted(palettes.palettes.keys()),
help="Select color palette: " + ", ".join(palettes.palettes.keys())
)
parser.add_argument(
"--palette-transparent",
- action="store_true", dest="palette_transparent", default=False,
+ action="store_true", dest="palette_transparent",
help="Set transparent background for palette."
)
parser.add_argument(
@@ -798,7 +795,7 @@ def mitmproxy():
)
parser.add_argument(
"--order",
- type=str, dest="order", default=None,
+ type=str, dest="order",
choices=[o[1] for o in view.orders],
help="Flow sort order."
)
@@ -813,33 +810,24 @@ def mitmproxy():
)
group.add_argument(
"-i", "--intercept", action="store",
- type=str, dest="intercept", default=None,
+ type=str, dest="intercept",
help="Intercept filter expression."
)
group.add_argument(
"-f", "--filter", action="store",
- type=str, dest="filter", default=None,
+ type=str, dest="filter",
help="Filter view expression."
)
return parser
def mitmdump():
- parser = configargparse.ArgumentParser(
- usage="%(prog)s [options] [filter]",
- args_for_setting_config_path=["--conf"],
- default_config_files=[
- os.path.join(options.CA_DIR, "common.conf"),
- os.path.join(options.CA_DIR, "mitmdump.conf")
- ],
- add_config_file_help=True,
- add_env_var_help=True
- )
+ parser = argparse.ArgumentParser(usage="%(prog)s [options] [filter]")
common_options(parser)
parser.add_argument(
"--keepserving",
- action="store_true", dest="keepserving", default=False,
+ action="store_true", dest="keepserving",
help="""
Continue serving after client playback or file read. We exit by
default.
@@ -847,7 +835,7 @@ def mitmdump():
)
parser.add_argument(
"-d", "--detail",
- action="count", dest="flow_detail", default=1,
+ action="count", dest="flow_detail",
help="Increase flow detail display level. Can be passed multiple times."
)
parser.add_argument(
@@ -862,16 +850,7 @@ def mitmdump():
def mitmweb():
- parser = configargparse.ArgumentParser(
- usage="%(prog)s [options]",
- args_for_setting_config_path=["--conf"],
- default_config_files=[
- os.path.join(options.CA_DIR, "common.conf"),
- os.path.join(options.CA_DIR, "mitmweb.conf")
- ],
- add_config_file_help=True,
- add_env_var_help=True
- )
+ parser = argparse.ArgumentParser(usage="%(prog)s [options]")
group = parser.add_argument_group("Mitmweb")
group.add_argument(
@@ -881,13 +860,13 @@ def mitmweb():
)
group.add_argument(
"--wport",
- action="store", type=int, dest="wport", default=8081,
+ action="store", type=int, dest="wport",
metavar="PORT",
help="Mitmweb port."
)
group.add_argument(
"--wiface",
- action="store", dest="wiface", default="127.0.0.1",
+ action="store", dest="wiface",
metavar="IFACE",
help="Mitmweb interface."
)
@@ -904,7 +883,7 @@ def mitmweb():
)
group.add_argument(
"-i", "--intercept", action="store",
- type=str, dest="intercept", default=None,
+ type=str, dest="intercept",
help="Intercept filter expression."
)
return parser
diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py
index 5d0e0ef4..9b6cc6ab 100644
--- a/mitmproxy/tools/console/master.py
+++ b/mitmproxy/tools/console/master.py
@@ -11,7 +11,6 @@ import tempfile
import traceback
import urwid
-from typing import Optional
from mitmproxy import addons
from mitmproxy import controller
@@ -39,33 +38,6 @@ from mitmproxy.net import tcp
EVENTLOG_SIZE = 500
-class Options(mitmproxy.options.Options):
- def __init__(
- self,
- *, # all args are keyword-only.
- eventlog: bool = False,
- focus_follow: bool = False,
- intercept: Optional[str] = None,
- filter: Optional[str] = None,
- palette: Optional[str] = None,
- palette_transparent: bool = False,
- no_mouse: bool = False,
- order: Optional[str] = None,
- order_reversed: bool = False,
- **kwargs
- ):
- self.eventlog = eventlog
- self.focus_follow = focus_follow
- self.intercept = intercept
- self.filter = filter
- self.palette = palette
- self.palette_transparent = palette_transparent
- self.no_mouse = no_mouse
- self.order = order
- self.order_reversed = order_reversed
- super().__init__(**kwargs)
-
-
class ConsoleMaster(master.Master):
palette = []
@@ -77,9 +49,6 @@ class ConsoleMaster(master.Master):
self.options = self.options # type: Options
self.options.errored.connect(self.options_error)
- self.palette = options.palette
- self.palette_transparent = options.palette_transparent
-
self.logbuffer = urwid.SimpleListWalker([])
self.view_stack = []
@@ -253,10 +222,11 @@ class ConsoleMaster(master.Master):
self.ui.start()
os.unlink(name)
- def set_palette(self, name):
- self.palette = name
+ def set_palette(self, options, updated):
self.ui.register_palette(
- palettes.palettes[name].palette(self.palette_transparent)
+ palettes.palettes[options.palette].palette(
+ options.palette_transparent
+ )
)
self.ui.clear()
@@ -269,7 +239,11 @@ class ConsoleMaster(master.Master):
def run(self):
self.ui = urwid.raw_display.Screen()
self.ui.set_terminal_properties(256)
- self.set_palette(self.palette)
+ self.set_palette(self.options, None)
+ self.options.subscribe(
+ self.set_palette,
+ ["palette", "palette_transparent"]
+ )
self.loop = urwid.MainLoop(
urwid.SolidFill("x"),
screen = self.ui,
diff --git a/mitmproxy/tools/console/options.py b/mitmproxy/tools/console/options.py
index 824041dc..94483b3d 100644
--- a/mitmproxy/tools/console/options.py
+++ b/mitmproxy/tools/console/options.py
@@ -3,7 +3,6 @@ import urwid
from mitmproxy import contentviews
from mitmproxy.tools.console import common
from mitmproxy.tools.console import grideditor
-from mitmproxy.tools.console import palettes
from mitmproxy.tools.console import select
from mitmproxy.tools.console import signals
@@ -26,6 +25,12 @@ def _mkhelp():
help_context = _mkhelp()
+def checker(opt, options):
+ def _check():
+ return options.has_changed(opt)
+ return _check
+
+
class Options(urwid.WidgetWrap):
def __init__(self, master):
@@ -36,25 +41,25 @@ class Options(urwid.WidgetWrap):
select.Option(
"Header Set Patterns",
"H",
- lambda: len(master.options.setheaders),
+ checker("setheaders", master.options),
self.setheaders
),
select.Option(
"Ignore Patterns",
"I",
- lambda: master.options.ignore_hosts,
+ checker("ignore_hosts", master.options),
self.ignore_hosts
),
select.Option(
"Replacement Patterns",
"R",
- lambda: len(master.options.replacements),
+ checker("replacements", master.options),
self.replacepatterns
),
select.Option(
"Scripts",
"S",
- lambda: master.options.scripts,
+ checker("scripts", master.options),
self.scripts
),
@@ -62,19 +67,19 @@ class Options(urwid.WidgetWrap):
select.Option(
"Default Display Mode",
"M",
- lambda: self.master.options.default_contentview != "auto",
+ checker("default_contentview", master.options),
self.default_displaymode
),
select.Option(
"Palette",
"P",
- lambda: self.master.palette != palettes.DEFAULT,
+ checker("palette", master.options),
self.palette
),
select.Option(
"Show Host",
"w",
- lambda: master.options.showhost,
+ checker("showhost", master.options),
master.options.toggler("showhost")
),
@@ -82,19 +87,19 @@ class Options(urwid.WidgetWrap):
select.Option(
"No Upstream Certs",
"U",
- lambda: master.options.no_upstream_cert,
+ checker("no_upstream_cert", master.options),
master.options.toggler("no_upstream_cert")
),
select.Option(
"TCP Proxying",
"T",
- lambda: master.options.tcp_hosts,
+ checker("tcp_hosts", master.options),
self.tcp_hosts
),
select.Option(
"Don't Verify SSL/TLS Certificates",
"V",
- lambda: master.options.ssl_insecure,
+ checker("ssl_insecure", master.options),
master.options.toggler("ssl_insecure")
),
@@ -102,37 +107,37 @@ class Options(urwid.WidgetWrap):
select.Option(
"Anti-Cache",
"a",
- lambda: master.options.anticache,
+ checker("anticache", master.options),
master.options.toggler("anticache")
),
select.Option(
"Anti-Compression",
"o",
- lambda: master.options.anticomp,
+ checker("anticomp", master.options),
master.options.toggler("anticomp")
),
select.Option(
"Kill Extra",
"x",
- lambda: master.options.replay_kill_extra,
+ checker("replay_kill_extra", master.options),
master.options.toggler("replay_kill_extra")
),
select.Option(
"No Refresh",
"f",
- lambda: not master.options.refresh_server_playback,
+ checker("refresh_server_playback", master.options),
master.options.toggler("refresh_server_playback")
),
select.Option(
"Sticky Auth",
"A",
- lambda: master.options.stickyauth,
+ checker("stickyauth", master.options),
self.sticky_auth
),
select.Option(
"Sticky Cookies",
"t",
- lambda: master.options.stickycookie,
+ checker("stickycookie", master.options),
self.sticky_cookie
),
]
@@ -160,25 +165,10 @@ class Options(urwid.WidgetWrap):
return super().keypress(size, key)
def clearall(self):
- self.master.options.update(
- anticache = False,
- anticomp = False,
- ignore_hosts = (),
- tcp_hosts = (),
- replay_kill_extra = False,
- no_upstream_cert = False,
- refresh_server_playback = True,
- replacements = [],
- scripts = [],
- setheaders = [],
- showhost = False,
- stickyauth = None,
- stickycookie = None,
- default_contentview = "auto",
- )
+ self.master.options.reset()
signals.update_settings.send(self)
signals.status_message.send(
- message = "All select.Options cleared",
+ message = "Options cleared",
expire = 1
)
diff --git a/mitmproxy/tools/console/palettepicker.py b/mitmproxy/tools/console/palettepicker.py
index a3eb9b90..0d943baf 100644
--- a/mitmproxy/tools/console/palettepicker.py
+++ b/mitmproxy/tools/console/palettepicker.py
@@ -3,7 +3,6 @@ import urwid
from mitmproxy.tools.console import common
from mitmproxy.tools.console import palettes
from mitmproxy.tools.console import select
-from mitmproxy.tools.console import signals
footer = [
('heading_key', "enter/space"), ":select",
@@ -43,8 +42,8 @@ class PalettePicker(urwid.WidgetWrap):
return select.Option(
i,
None,
- lambda: self.master.palette == name,
- lambda: self.select(name)
+ lambda: self.master.options.palette == name,
+ lambda: setattr(self.master.options, "palette", name)
)
for i in high:
@@ -59,8 +58,8 @@ class PalettePicker(urwid.WidgetWrap):
select.Option(
"Transparent",
"T",
- lambda: master.palette_transparent,
- self.toggle_palette_transparent
+ lambda: master.options.palette_transparent,
+ master.options.toggler("palette_transparent")
)
]
)
@@ -73,15 +72,7 @@ class PalettePicker(urwid.WidgetWrap):
self.lb,
header = title
)
- signals.update_settings.connect(self.sig_update_settings)
+ master.options.changed.connect(self.sig_options_changed)
- def sig_update_settings(self, sender):
+ def sig_options_changed(self, options, updated):
self.lb.walker._modified()
-
- def select(self, name):
- self.master.set_palette(name)
-
- def toggle_palette_transparent(self):
- self.master.palette_transparent = not self.master.palette_transparent
- self.master.set_palette(self.master.palette)
- signals.update_settings.send(self)
diff --git a/mitmproxy/tools/dump.py b/mitmproxy/tools/dump.py
index 3cd94c30..90332627 100644
--- a/mitmproxy/tools/dump.py
+++ b/mitmproxy/tools/dump.py
@@ -1,9 +1,8 @@
-from typing import Optional, IO
+from typing import Optional
from mitmproxy import controller
from mitmproxy import exceptions
from mitmproxy import addons
-from mitmproxy import io
from mitmproxy import options
from mitmproxy import master
from mitmproxy.addons import dumper, termlog
@@ -21,13 +20,11 @@ class Options(options.Options):
keepserving: bool = False,
filtstr: Optional[str] = None,
flow_detail: int = 1,
- tfile: Optional[IO[str]] = None,
**kwargs
) -> None:
self.filtstr = filtstr
self.flow_detail = flow_detail
self.keepserving = keepserving
- self.tfile = tfile
super().__init__(**kwargs)
@@ -62,16 +59,6 @@ class DumpMaster(master.Master):
self.add_log("Flow file corrupted.", "error")
raise DumpError(v)
- def _readflow(self, paths):
- """
- Utitility function that reads a list of flows
- or raises a DumpError if that fails.
- """
- try:
- return io.read_flows_from_paths(paths)
- except exceptions.FlowReadException as e:
- raise DumpError(str(e))
-
@controller.handler
def log(self, e):
if e.level == "error":
diff --git a/mitmproxy/tools/main.py b/mitmproxy/tools/main.py
index c3b1e3a9..3c0e44bc 100644
--- a/mitmproxy/tools/main.py
+++ b/mitmproxy/tools/main.py
@@ -11,12 +11,21 @@ import signal # noqa
from mitmproxy.tools import cmdline # noqa
from mitmproxy import exceptions # noqa
+from mitmproxy import options # noqa
from mitmproxy.proxy import config # noqa
from mitmproxy.proxy import server # noqa
from mitmproxy.utils import version_check # noqa
from mitmproxy.utils import debug # noqa
+def notnone(d):
+ ret = {}
+ for k, v in d.items():
+ if v is not None:
+ ret[k] = v
+ return ret
+
+
def assert_utf8_env():
spec = ""
for i in ["LANG", "LC_CTYPE", "LC_ALL"]:
@@ -63,17 +72,21 @@ def mitmproxy(args=None): # pragma: no cover
args = parser.parse_args(args)
try:
- console_options = console.master.Options(
- **cmdline.get_common_options(args)
+ console_options = options.Options()
+ console_options.load_paths(args.conf)
+ console_options.update(**notnone(cmdline.get_common_options(args)))
+ console_options.update(
+ **notnone(dict(
+ palette = args.palette,
+ palette_transparent = args.palette_transparent,
+ eventlog = args.eventlog,
+ focus_follow = args.focus_follow,
+ intercept = args.intercept,
+ filter = args.filter,
+ no_mouse = args.no_mouse,
+ order = args.order,
+ ))
)
- console_options.palette = args.palette
- console_options.palette_transparent = args.palette_transparent
- console_options.eventlog = args.eventlog
- console_options.focus_follow = args.focus_follow
- console_options.intercept = args.intercept
- console_options.filter = args.filter
- console_options.no_mouse = args.no_mouse
- console_options.order = args.order
server = process_options(parser, console_options, args)
m = console.master.ConsoleMaster(console_options, server)
@@ -98,10 +111,17 @@ def mitmdump(args=None): # pragma: no cover
master = None
try:
- dump_options = dump.Options(**cmdline.get_common_options(args))
- dump_options.flow_detail = args.flow_detail
- dump_options.keepserving = args.keepserving
- dump_options.filtstr = " ".join(args.filter) if args.filter else None
+ dump_options = options.Options()
+ dump_options.load_paths(args.conf)
+ dump_options.update(**notnone(cmdline.get_common_options(args)))
+ dump_options.update(
+ **notnone(dict(
+ flow_detail = args.flow_detail,
+ keepserving = args.keepserving,
+ filtstr = " ".join(args.filter) if args.filter else None,
+ ))
+ )
+
server = process_options(parser, dump_options, args)
master = dump.DumpMaster(dump_options, server)
@@ -130,13 +150,18 @@ def mitmweb(args=None): # pragma: no cover
args = parser.parse_args(args)
try:
- web_options = web.master.Options(**cmdline.get_common_options(args))
- web_options.intercept = args.intercept
- web_options.open_browser = args.open_browser
- web_options.wdebug = args.wdebug
- web_options.wiface = args.wiface
- web_options.wport = args.wport
-
+ web_options = options.Options()
+ web_options.load_paths(args.conf)
+ web_options.update(**notnone(cmdline.get_common_options(args)))
+ web_options.update(
+ **notnone(dict(
+ intercept = args.intercept,
+ open_browser = args.open_browser,
+ wdebug = args.wdebug,
+ wiface = args.wiface,
+ wport = args.wport,
+ ))
+ )
server = process_options(parser, web_options, args)
m = web.master.WebMaster(web_options, server)
except exceptions.OptionsError as e:
diff --git a/mitmproxy/tools/web/master.py b/mitmproxy/tools/web/master.py
index 89ad698d..edb12467 100644
--- a/mitmproxy/tools/web/master.py
+++ b/mitmproxy/tools/web/master.py
@@ -1,5 +1,4 @@
import webbrowser
-from typing import Optional, IO
import tornado.httpserver
import tornado.ioloop
@@ -7,7 +6,6 @@ from mitmproxy import addons
from mitmproxy import exceptions
from mitmproxy import log
from mitmproxy import master
-from mitmproxy import options
from mitmproxy.addons import eventstore
from mitmproxy.addons import intercept
from mitmproxy.addons import termlog
@@ -15,27 +13,6 @@ from mitmproxy.addons import view
from mitmproxy.tools.web import app
-class Options(options.Options):
- def __init__(
- self,
- *, # all args are keyword-only.
- intercept: Optional[str] = None,
- tfile: Optional[IO[str]] = None,
- open_browser: bool = True,
- wdebug: bool = False,
- wport: int = 8081,
- wiface: str = "127.0.0.1",
- **kwargs
- ) -> None:
- self.intercept = intercept
- self.tfile = tfile
- self.open_browser = open_browser
- self.wdebug = wdebug
- self.wport = wport
- self.wiface = wiface
- super().__init__(**kwargs)
-
-
class WebMaster(master.Master):
def __init__(self, options, server):
super().__init__(options, server)