aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/tools
diff options
context:
space:
mode:
Diffstat (limited to 'mitmproxy/tools')
-rw-r--r--mitmproxy/tools/cmdline.py174
-rw-r--r--mitmproxy/tools/console/flowlist.py6
-rw-r--r--mitmproxy/tools/console/master.py22
-rw-r--r--mitmproxy/tools/console/options.py21
-rw-r--r--mitmproxy/tools/console/palettepicker.py4
-rw-r--r--mitmproxy/tools/console/statusbar.py8
-rw-r--r--mitmproxy/tools/dump.py18
-rw-r--r--mitmproxy/tools/main.py23
-rw-r--r--mitmproxy/tools/web/master.py8
9 files changed, 86 insertions, 198 deletions
diff --git a/mitmproxy/tools/cmdline.py b/mitmproxy/tools/cmdline.py
index f607ad71..1c620fd6 100644
--- a/mitmproxy/tools/cmdline.py
+++ b/mitmproxy/tools/cmdline.py
@@ -1,9 +1,7 @@
import argparse
-import re
import os
from mitmproxy import exceptions
-from mitmproxy import flowfilter
from mitmproxy import options
from mitmproxy import platform
from mitmproxy.utils import human
@@ -19,91 +17,6 @@ class ParseException(Exception):
pass
-def _parse_hook(s):
- sep, rem = s[0], s[1:]
- parts = rem.split(sep, 2)
- if len(parts) == 2:
- patt = ".*"
- a, b = parts
- elif len(parts) == 3:
- patt, a, b = parts
- else:
- raise ParseException(
- "Malformed hook specifier - too few clauses: %s" % s
- )
-
- if not a:
- raise ParseException("Empty clause: %s" % str(patt))
-
- if not flowfilter.parse(patt):
- raise ParseException("Malformed filter pattern: %s" % patt)
-
- return patt, a, b
-
-
-def parse_replace_hook(s):
- """
- Returns a (pattern, regex, replacement) tuple.
-
- The general form for a replacement hook is as follows:
-
- /patt/regex/replacement
-
- The first character specifies the separator. Example:
-
- :~q:foo:bar
-
- If only two clauses are specified, the pattern is set to match
- universally (i.e. ".*"). Example:
-
- /foo/bar/
-
- Clauses are parsed from left to right. Extra separators are taken to be
- part of the final clause. For instance, the replacement clause below is
- "foo/bar/":
-
- /one/two/foo/bar/
-
- Checks that pattern and regex are both well-formed. Raises
- ParseException on error.
- """
- patt, regex, replacement = _parse_hook(s)
- try:
- re.compile(regex)
- except re.error as e:
- raise ParseException("Malformed replacement regex: %s" % str(e))
- return patt, regex, replacement
-
-
-def parse_setheader(s):
- """
- Returns a (pattern, header, value) tuple.
-
- The general form for a replacement hook is as follows:
-
- /patt/header/value
-
- The first character specifies the separator. Example:
-
- :~q:foo:bar
-
- If only two clauses are specified, the pattern is set to match
- universally (i.e. ".*"). Example:
-
- /foo/bar/
-
- Clauses are parsed from left to right. Extra separators are taken to be
- part of the final clause. For instance, the value clause below is
- "foo/bar/":
-
- /one/two/foo/bar/
-
- Checks that pattern and regex are both well-formed. Raises
- ParseException on error.
- """
- return _parse_hook(s)
-
-
def get_common_options(args):
stickycookie, stickyauth = None, None
if args.stickycookie_filt:
@@ -116,34 +29,6 @@ def get_common_options(args):
if stream_large_bodies:
stream_large_bodies = human.parse_size(stream_large_bodies)
- reps = []
- 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 or []:
- try:
- patt, rex, path = parse_replace_hook(i)
- except ParseException as e:
- raise exceptions.OptionsError(e)
- try:
- v = open(path, "rb").read()
- except IOError as e:
- raise exceptions.OptionsError(
- "Could not read replace file: %s" % path
- )
- reps.append((patt, rex, v))
-
- setheaders = []
- for i in args.setheader or []:
- try:
- p = parse_setheader(i)
- except ParseException as e:
- raise exceptions.OptionsError(e)
- setheaders.append(p)
-
if args.streamfile and args.streamfile[0] == args.rfile:
if args.streamfile[1] == "wb":
raise exceptions.OptionsError(
@@ -212,9 +97,9 @@ def get_common_options(args):
args.verbose = 0
return dict(
- app=args.app,
- app_host=args.app_host,
- app_port=args.app_port,
+ onboarding=args.onboarding,
+ onboarding_host=args.onboarding_host,
+ onboarding_port=args.onboarding_port,
anticache=args.anticache,
anticomp=args.anticomp,
@@ -224,8 +109,9 @@ def get_common_options(args):
refresh_server_playback=not args.norefresh,
server_replay_use_headers=args.server_replay_use_headers,
rfile=args.rfile,
- replacements=reps,
- setheaders=setheaders,
+ replacements=args.replacements,
+ replacement_files=args.replacement_files,
+ setheaders=args.setheaders,
server_replay=args.server_replay,
scripts=args.scripts,
stickycookie=stickycookie,
@@ -568,13 +454,13 @@ def proxy_ssl_options(parser):
def onboarding_app(parser):
group = parser.add_argument_group("Onboarding App")
group.add_argument(
- "--noapp",
- action="store_false", dest="app",
+ "--no-onboarding",
+ action="store_false", dest="onboarding",
help="Disable the mitmproxy onboarding app."
)
group.add_argument(
- "--app-host",
- action="store", dest="app_host",
+ "--onboarding-host",
+ action="store", dest="onboarding_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:
@@ -582,9 +468,9 @@ def onboarding_app(parser):
""" % options.APP_HOST
)
group.add_argument(
- "--app-port",
+ "--onboarding-port",
action="store",
- dest="app_port",
+ dest="onboarding_port",
type=int,
metavar="80",
help="Port to serve the onboarding app from."
@@ -676,13 +562,13 @@ def replacements(parser):
)
group.add_argument(
"--replace",
- action="append", type=str, dest="replace",
+ action="append", type=str, dest="replacements",
metavar="PATTERN",
help="Replacement pattern."
)
group.add_argument(
"--replace-from-file",
- action="append", type=str, dest="replace_file",
+ action="append", type=str, dest="replacement_files",
metavar="PATH",
help="""
Replacement pattern, where the replacement clause is a path to a
@@ -702,7 +588,7 @@ def set_headers(parser):
)
group.add_argument(
"--setheader",
- action="append", type=str, dest="setheader",
+ action="append", type=str, dest="setheaders",
metavar="PATTERN",
help="Header set pattern."
)
@@ -762,42 +648,42 @@ def common_options(parser):
def mitmproxy():
- # Don't import mitmproxy.tools.console for mitmdump, urwid is not available on all
- # platforms.
+ # Don't import mitmproxy.tools.console for mitmdump, urwid is not available
+ # on all platforms.
from .console import palettes
parser = argparse.ArgumentParser(usage="%(prog)s [options]")
common_options(parser)
parser.add_argument(
"--palette", type=str,
- action="store", dest="palette",
+ action="store", dest="console_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",
+ action="store_true", dest="console_palette_transparent",
help="Set transparent background for palette."
)
parser.add_argument(
"-e", "--eventlog",
- action="store_true", dest="eventlog",
+ action="store_true", dest="console_eventlog",
help="Show event log."
)
parser.add_argument(
"--follow",
- action="store_true", dest="focus_follow",
+ action="store_true", dest="console_focus_follow",
help="Focus follows new flows."
)
parser.add_argument(
"--order",
- type=str, dest="order",
+ type=str, dest="console_order",
choices=[o[1] for o in view.orders],
help="Flow sort order."
)
parser.add_argument(
"--no-mouse",
- action="store_true", dest="no_mouse",
+ action="store_true", dest="console_no_mouse",
help="Disable mouse interaction."
)
group = parser.add_argument_group(
@@ -851,24 +737,24 @@ def mitmweb():
group = parser.add_argument_group("Mitmweb")
group.add_argument(
"--no-browser",
- action="store_false", dest="open_browser",
+ action="store_false", dest="web_open_browser",
help="Don't start a browser"
)
group.add_argument(
- "--wport",
- action="store", type=int, dest="wport",
+ "--web-port",
+ action="store", type=int, dest="web_port",
metavar="PORT",
help="Mitmweb port."
)
group.add_argument(
- "--wiface",
- action="store", dest="wiface",
+ "--web-iface",
+ action="store", dest="web_iface",
metavar="IFACE",
help="Mitmweb interface."
)
group.add_argument(
- "--wdebug",
- action="store_true", dest="wdebug",
+ "--web-debug",
+ action="store_true", dest="web_debug",
help="Turn on mitmweb debugging"
)
diff --git a/mitmproxy/tools/console/flowlist.py b/mitmproxy/tools/console/flowlist.py
index 1fe0be73..8ee2d55d 100644
--- a/mitmproxy/tools/console/flowlist.py
+++ b/mitmproxy/tools/console/flowlist.py
@@ -387,7 +387,7 @@ class FlowListBox(urwid.ListBox):
lookup = dict([(i[0], i[1]) for i in view.orders])
def change_order(k):
- self.master.options.order = lookup[k]
+ self.master.options.console_order = lookup[k]
signals.status_prompt_onekey.send(
prompt = "Order",
@@ -398,8 +398,8 @@ class FlowListBox(urwid.ListBox):
o = self.master.options
o.focus_follow = not o.focus_follow
elif key == "v":
- val = not self.master.options.order_reversed
- self.master.options.order_reversed = val
+ val = not self.master.options.console_order_reversed
+ self.master.options.console_order_reversed = val
elif key == "W":
if self.master.options.streamfile:
self.master.options.streamfile = None
diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py
index 8afdce2c..77b48e8d 100644
--- a/mitmproxy/tools/console/master.py
+++ b/mitmproxy/tools/console/master.py
@@ -33,8 +33,6 @@ from mitmproxy.tools.console import statusbar
from mitmproxy.tools.console import window
from mitmproxy.utils import strutils
-from mitmproxy.net import tcp
-
EVENTLOG_SIZE = 10000
@@ -108,7 +106,7 @@ class ConsoleMaster(master.Master):
self.logbuffer.append(e)
if len(self.logbuffer) > EVENTLOG_SIZE:
self.logbuffer.pop(0)
- if self.options.focus_follow:
+ if self.options.console_focus_follow:
self.logbuffer.set_focus(len(self.logbuffer) - 1)
def sig_call_in(self, sender, seconds, callback, args=()):
@@ -152,7 +150,7 @@ class ConsoleMaster(master.Master):
signals.add_log("Script error: %s" % e, "warn")
def toggle_eventlog(self):
- self.options.eventlog = not self.options.eventlog
+ self.options.console_eventlog = not self.options.console_eventlog
self.view_flowlist()
signals.replace_view_state.send(self)
@@ -232,8 +230,8 @@ class ConsoleMaster(master.Master):
def set_palette(self, options, updated):
self.ui.register_palette(
- palettes.palettes[options.palette].palette(
- options.palette_transparent
+ palettes.palettes[options.console_palette].palette(
+ options.console_palette_transparent
)
)
self.ui.clear()
@@ -255,7 +253,7 @@ class ConsoleMaster(master.Master):
self.loop = urwid.MainLoop(
urwid.SolidFill("x"),
screen = self.ui,
- handle_mouse = not self.options.no_mouse,
+ handle_mouse = not self.options.console_no_mouse,
)
self.ab = statusbar.ActionBar()
@@ -273,14 +271,6 @@ class ConsoleMaster(master.Master):
sys.exit(1)
self.loop.set_alarm_in(0.01, self.ticker)
- if self.options.http2 and not tcp.HAS_ALPN: # pragma: no cover
- def http2err(*args, **kwargs):
- signals.status_message.send(
- message = "HTTP/2 disabled - OpenSSL 1.0.2+ required."
- " Use --no-http2 to silence this warning.",
- expire=5
- )
- self.loop.set_alarm_in(0.01, http2err)
self.loop.set_alarm_in(
0.0001,
@@ -357,7 +347,7 @@ class ConsoleMaster(master.Master):
if self.ui.started:
self.ui.clear()
- if self.options.eventlog:
+ if self.options.console_eventlog:
body = flowlist.BodyPile(self)
else:
body = flowlist.FlowListBox(self)
diff --git a/mitmproxy/tools/console/options.py b/mitmproxy/tools/console/options.py
index 54876f87..4115bd18 100644
--- a/mitmproxy/tools/console/options.py
+++ b/mitmproxy/tools/console/options.py
@@ -6,6 +6,9 @@ from mitmproxy.tools.console import grideditor
from mitmproxy.tools.console import select
from mitmproxy.tools.console import signals
+from mitmproxy.addons import replace
+from mitmproxy.addons import setheaders
+
footer = [
('heading_key', "enter/space"), ":toggle ",
('heading_key', "C"), ":clear all ",
@@ -75,7 +78,7 @@ class Options(urwid.WidgetWrap):
select.Option(
"Palette",
"P",
- checker("palette", master.options),
+ checker("console_palette", master.options),
self.palette
),
select.Option(
@@ -188,10 +191,16 @@ class Options(urwid.WidgetWrap):
)
def setheaders(self):
+ data = []
+ for d in self.master.options.setheaders:
+ if isinstance(d, str):
+ data.append(setheaders.parse_setheader(d))
+ else:
+ data.append(d)
self.master.view_grideditor(
grideditor.SetHeadersEditor(
self.master,
- self.master.options.setheaders,
+ data,
self.master.options.setter("setheaders")
)
)
@@ -215,10 +224,16 @@ class Options(urwid.WidgetWrap):
)
def replacepatterns(self):
+ data = []
+ for d in self.master.options.replacements:
+ if isinstance(d, str):
+ data.append(replace.parse_hook(d))
+ else:
+ data.append(d)
self.master.view_grideditor(
grideditor.ReplaceEditor(
self.master,
- self.master.options.replacements,
+ data,
self.master.options.setter("replacements")
)
)
diff --git a/mitmproxy/tools/console/palettepicker.py b/mitmproxy/tools/console/palettepicker.py
index 0d943baf..4c5c62a0 100644
--- a/mitmproxy/tools/console/palettepicker.py
+++ b/mitmproxy/tools/console/palettepicker.py
@@ -42,7 +42,7 @@ class PalettePicker(urwid.WidgetWrap):
return select.Option(
i,
None,
- lambda: self.master.options.palette == name,
+ lambda: self.master.options.console_palette == name,
lambda: setattr(self.master.options, "palette", name)
)
@@ -58,7 +58,7 @@ class PalettePicker(urwid.WidgetWrap):
select.Option(
"Transparent",
"T",
- lambda: master.options.palette_transparent,
+ lambda: master.options.console_palette_transparent,
master.options.toggler("palette_transparent")
)
]
diff --git a/mitmproxy/tools/console/statusbar.py b/mitmproxy/tools/console/statusbar.py
index 785dc766..2c7f9efb 100644
--- a/mitmproxy/tools/console/statusbar.py
+++ b/mitmproxy/tools/console/statusbar.py
@@ -204,10 +204,10 @@ class StatusBar(urwid.WidgetWrap):
r.append("[")
r.append(("heading_key", "M"))
r.append(":%s]" % self.master.options.default_contentview)
- if self.master.options.order:
+ if self.master.options.console_order:
r.append("[")
r.append(("heading_key", "o"))
- r.append(":%s]" % self.master.options.order)
+ r.append(":%s]" % self.master.options.console_order)
opts = []
if self.master.options.anticache:
@@ -222,7 +222,7 @@ class StatusBar(urwid.WidgetWrap):
opts.append("killextra")
if self.master.options.no_upstream_cert:
opts.append("no-upstream-cert")
- if self.master.options.focus_follow:
+ if self.master.options.console_focus_follow:
opts.append("following")
if self.master.options.stream_large_bodies:
opts.append(
@@ -258,7 +258,7 @@ class StatusBar(urwid.WidgetWrap):
else:
offset = self.master.view.focus.index + 1
- if self.master.options.order_reversed:
+ if self.master.options.console_order_reversed:
arrow = common.SYMBOL_UP
else:
arrow = common.SYMBOL_DOWN
diff --git a/mitmproxy/tools/dump.py b/mitmproxy/tools/dump.py
index 4e2844a1..e1e40fb0 100644
--- a/mitmproxy/tools/dump.py
+++ b/mitmproxy/tools/dump.py
@@ -6,7 +6,6 @@ from mitmproxy import addons
from mitmproxy import options
from mitmproxy import master
from mitmproxy.addons import dumper, termlog
-from mitmproxy.net import tcp
class DumpError(Exception):
@@ -30,7 +29,13 @@ class Options(options.Options):
class DumpMaster(master.Master):
- def __init__(self, options, server, with_termlog=True, with_dumper=True):
+ def __init__(
+ self,
+ options: Options,
+ server,
+ with_termlog=True,
+ with_dumper=True,
+ ) -> None:
master.Master.__init__(self, options, server)
self.has_errored = False
if with_termlog:
@@ -38,8 +43,6 @@ class DumpMaster(master.Master):
self.addons.add(*addons.default_addons())
if with_dumper:
self.addons.add(dumper.Dumper())
- # This line is just for type hinting
- self.options = self.options # type: Options
if not self.options.no_server:
self.add_log(
@@ -47,13 +50,6 @@ class DumpMaster(master.Master):
"info"
)
- if self.server and self.options.http2 and not tcp.HAS_ALPN: # pragma: no cover
- self.add_log(
- "ALPN support missing (OpenSSL 1.0.2+ required)!\n"
- "HTTP/2 is disabled. Use --no-http2 to silence this warning.",
- "error"
- )
-
if options.rfile:
try:
self.load_flows_file(options.rfile)
diff --git a/mitmproxy/tools/main.py b/mitmproxy/tools/main.py
index 727e993f..ce78cd13 100644
--- a/mitmproxy/tools/main.py
+++ b/mitmproxy/tools/main.py
@@ -70,14 +70,15 @@ def mitmproxy(args=None): # pragma: no cover
console_options.merge(cmdline.get_common_options(args))
console_options.merge(
dict(
- palette = args.palette,
- palette_transparent = args.palette_transparent,
- eventlog = args.eventlog,
- focus_follow = args.focus_follow,
- intercept = args.intercept,
+ console_palette = args.console_palette,
+ console_palette_transparent = args.console_palette_transparent,
+ console_eventlog = args.console_eventlog,
+ console_focus_follow = args.console_focus_follow,
+ console_no_mouse = args.console_no_mouse,
+ console_order = args.console_order,
+
filter = args.filter,
- no_mouse = args.no_mouse,
- order = args.order,
+ intercept = args.intercept,
)
)
@@ -149,10 +150,10 @@ def mitmweb(args=None): # pragma: no cover
web_options.merge(
dict(
intercept = args.intercept,
- open_browser = args.open_browser,
- wdebug = args.wdebug,
- wiface = args.wiface,
- wport = args.wport,
+ web_open_browser = args.web_open_browser,
+ web_debug = args.web_debug,
+ web_iface = args.web_iface,
+ web_port = args.web_port,
)
)
server = process_options(parser, web_options, args)
diff --git a/mitmproxy/tools/web/master.py b/mitmproxy/tools/web/master.py
index e6c15a0a..6ebcfe47 100644
--- a/mitmproxy/tools/web/master.py
+++ b/mitmproxy/tools/web/master.py
@@ -38,7 +38,7 @@ class WebMaster(master.Master):
if with_termlog:
self.addons.add(termlog.TermLog())
self.app = app.Application(
- self, self.options.wdebug
+ self, self.options.web_debug
)
# This line is just for type hinting
self.options = self.options # type: Options
@@ -103,7 +103,7 @@ class WebMaster(master.Master):
iol = tornado.ioloop.IOLoop.instance()
http_server = tornado.httpserver.HTTPServer(self.app)
- http_server.listen(self.options.wport, self.options.wiface)
+ http_server.listen(self.options.web_port, self.options.web_iface)
iol.add_callback(self.start)
tornado.ioloop.PeriodicCallback(lambda: self.tick(timeout=0), 5).start()
@@ -113,13 +113,13 @@ class WebMaster(master.Master):
"info"
)
- web_url = "http://{}:{}/".format(self.options.wiface, self.options.wport)
+ web_url = "http://{}:{}/".format(self.options.web_iface, self.options.web_port)
self.add_log(
"Web server listening at {}".format(web_url),
"info"
)
- if self.options.open_browser:
+ if self.options.web_open_browser:
success = open_browser(web_url)
if not success:
self.add_log(