aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@corte.si>2016-10-30 13:28:47 +1300
committerGitHub <noreply@github.com>2016-10-30 13:28:47 +1300
commit83b56527d9751d41d4079c46a94202fd56b89361 (patch)
treea6423466d7a884f00cd4a495472eab23e1ce4a57
parenta5857ec97a060e2f1624834364dda525c7ca2e0f (diff)
parentb9eb1a34791d6d48f132fc09d5320edaa128dda4 (diff)
downloadmitmproxy-83b56527d9751d41d4079c46a94202fd56b89361.tar.gz
mitmproxy-83b56527d9751d41d4079c46a94202fd56b89361.tar.bz2
mitmproxy-83b56527d9751d41d4079c46a94202fd56b89361.zip
Merge pull request #1689 from cortesi/contentoption
Add options.default_contentview
-rw-r--r--mitmproxy/addons/dumper.py4
-rw-r--r--mitmproxy/contentviews.py32
-rw-r--r--mitmproxy/options.py2
-rw-r--r--mitmproxy/tools/console/flowview.py6
-rw-r--r--mitmproxy/tools/console/master.py7
-rw-r--r--mitmproxy/tools/console/options.py10
-rw-r--r--mitmproxy/tools/console/statusbar.py4
-rw-r--r--test/mitmproxy/test_contentview.py8
8 files changed, 36 insertions, 37 deletions
diff --git a/mitmproxy/addons/dumper.py b/mitmproxy/addons/dumper.py
index fb92c629..b911142a 100644
--- a/mitmproxy/addons/dumper.py
+++ b/mitmproxy/addons/dumper.py
@@ -24,6 +24,7 @@ class Dumper:
self.flow_detail = None # type: int
self.outfp = None # type: typing.io.TextIO
self.showhost = None # type: bool
+ self.default_contentview = "auto" # type: str
def configure(self, options, updated):
if options.filtstr:
@@ -37,6 +38,7 @@ class Dumper:
self.flow_detail = options.flow_detail
self.outfp = options.tfile
self.showhost = options.showhost
+ self.default_contentview = options.default_contentview
def echo(self, text, ident=None, **style):
if ident:
@@ -61,7 +63,7 @@ class Dumper:
self.echo(headers, ident=4)
if self.flow_detail >= 3:
_, lines, error = contentviews.get_message_content_view(
- contentviews.get("Auto"),
+ self.default_contentview,
message
)
if error:
diff --git a/mitmproxy/contentviews.py b/mitmproxy/contentviews.py
index b7f15d8d..4f2838ee 100644
--- a/mitmproxy/contentviews.py
+++ b/mitmproxy/contentviews.py
@@ -2,15 +2,16 @@
Mitmproxy Content Views
=======================
-mitmproxy includes a set of content views which can be used to format/decode/highlight data.
-While they are currently used for HTTP message bodies only, the may be used in other contexts
-in the future, e.g. to decode protobuf messages sent as WebSocket frames.
-
-Thus, the View API is very minimalistic. The only arguments are `data` and `**metadata`,
-where `data` is the actual content (as bytes). The contents on metadata depend on the protocol in
-use. For HTTP, the message headers are passed as the ``headers`` keyword argument. For HTTP
-requests, the query parameters are passed as the ``query`` keyword argument.
-
+mitmproxy includes a set of content views which can be used to
+format/decode/highlight data. While they are currently used for HTTP message
+bodies only, the may be used in other contexts in the future, e.g. to decode
+protobuf messages sent as WebSocket frames.
+
+Thus, the View API is very minimalistic. The only arguments are `data` and
+`**metadata`, where `data` is the actual content (as bytes). The contents on
+metadata depend on the protocol in use. For HTTP, the message headers are
+passed as the ``headers`` keyword argument. For HTTP requests, the query
+parameters are passed as the ``query`` keyword argument.
"""
import datetime
@@ -97,11 +98,7 @@ class View:
prompt = ()
content_types = []
- def __call__(
- self,
- data: bytes,
- **metadata
- ):
+ def __call__(self, data: bytes, **metadata):
"""
Transform raw data into human-readable output.
@@ -528,7 +525,7 @@ view_prompts = []
def get(name):
for i in views:
- if i.name == name:
+ if i.name.lower() == name.lower():
return i
@@ -606,10 +603,13 @@ def safe_to_print(lines, encoding="utf8"):
yield clean_line
-def get_message_content_view(viewmode, message):
+def get_message_content_view(viewname, message):
"""
Like get_content_view, but also handles message encoding.
"""
+ viewmode = get(viewname)
+ if not viewmode:
+ get("auto")
try:
content = message.content
except ValueError:
diff --git a/mitmproxy/options.py b/mitmproxy/options.py
index 03547189..1db9f0f0 100644
--- a/mitmproxy/options.py
+++ b/mitmproxy/options.py
@@ -47,6 +47,7 @@ class Options(optmanager.OptManager):
stickyauth: Optional[str] = None,
stream_large_bodies: Optional[int] = None,
verbosity: int = 2,
+ default_contentview: str = "auto",
outfile: Optional[Tuple[str, str]] = None,
server_replay_ignore_content: bool = False,
server_replay_ignore_params: Sequence[str] = (),
@@ -106,6 +107,7 @@ class Options(optmanager.OptManager):
self.stickyauth = stickyauth
self.stream_large_bodies = stream_large_bodies
self.verbosity = verbosity
+ self.default_contentview = default_contentview
self.outfile = outfile
self.server_replay_ignore_content = server_replay_ignore_content
self.server_replay_ignore_params = server_replay_ignore_params
diff --git a/mitmproxy/tools/console/flowview.py b/mitmproxy/tools/console/flowview.py
index 18947327..5718b40e 100644
--- a/mitmproxy/tools/console/flowview.py
+++ b/mitmproxy/tools/console/flowview.py
@@ -241,7 +241,7 @@ class FlowView(tabs.Tabs):
self.flow,
(self.tab_offset, "prettyview")
)
- return self.state.default_body_view if override is None else override
+ return self.master.options.default_contentview if override is None else override
def conn_text(self, conn):
if conn:
@@ -264,7 +264,7 @@ class FlowView(tabs.Tabs):
" ",
('heading', "["),
('heading_key', "m"),
- ('heading', (":%s]" % viewmode.name)),
+ ('heading', (":%s]" % viewmode)),
],
align="right"
)
@@ -491,7 +491,7 @@ class FlowView(tabs.Tabs):
self.state.add_flow_setting(
self.flow,
(self.tab_offset, "prettyview"),
- contentviews.get_by_shortcut(t)
+ contentviews.get_by_shortcut(t).name
)
signals.flow_change.send(self, flow = self.flow)
diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py
index 69c60657..e9d8903d 100644
--- a/mitmproxy/tools/console/master.py
+++ b/mitmproxy/tools/console/master.py
@@ -15,7 +15,6 @@ import urwid
from typing import Optional
from mitmproxy import addons
-from mitmproxy import contentviews
from mitmproxy import controller
from mitmproxy import exceptions
from mitmproxy import master
@@ -49,7 +48,6 @@ class ConsoleState(state.State):
state.State.__init__(self)
self.focus = None
self.follow_focus = None
- self.default_body_view = contentviews.get("Auto")
self.flowsettings = weakref.WeakKeyDictionary()
self.last_search = None
self.last_filter = ""
@@ -612,11 +610,6 @@ class ConsoleMaster(master.Master):
signals.flowlist_change.send(self)
return v
- def change_default_display_mode(self, t):
- v = contentviews.get_by_shortcut(t)
- self.state.default_body_view = v
- self.refresh_focus()
-
def edit_scripts(self, scripts):
self.options.scripts = [x[0] for x in scripts]
diff --git a/mitmproxy/tools/console/options.py b/mitmproxy/tools/console/options.py
index 04a0d08c..194e4713 100644
--- a/mitmproxy/tools/console/options.py
+++ b/mitmproxy/tools/console/options.py
@@ -60,7 +60,7 @@ class Options(urwid.WidgetWrap):
select.Option(
"Default Display Mode",
"M",
- self.has_default_displaymode,
+ lambda: self.master.options.default_contentview != "auto",
self.default_displaymode
),
select.Option(
@@ -231,11 +231,13 @@ class Options(urwid.WidgetWrap):
signals.status_prompt_onekey.send(
prompt = "Global default display mode",
keys = contentviews.view_prompts,
- callback = self.master.change_default_display_mode
+ callback = self.change_default_display_mode
)
- def has_default_displaymode(self):
- return self.master.state.default_body_view.name != "Auto"
+ def change_default_display_mode(self, t):
+ v = contentviews.get_by_shortcut(t)
+ self.master.options.default_contentview = v.name
+ self.master.refresh_focus()
def sticky_auth(self):
signals.status_prompt.send(
diff --git a/mitmproxy/tools/console/statusbar.py b/mitmproxy/tools/console/statusbar.py
index 57ed86db..d09bcd48 100644
--- a/mitmproxy/tools/console/statusbar.py
+++ b/mitmproxy/tools/console/statusbar.py
@@ -176,10 +176,10 @@ class StatusBar(urwid.WidgetWrap):
r.append("[")
r.append(("heading_key", "u"))
r.append(":%s]" % self.master.options.stickyauth)
- if self.master.state.default_body_view.name != "Auto":
+ if self.master.options.default_contentview != "auto":
r.append("[")
r.append(("heading_key", "M"))
- r.append(":%s]" % self.master.state.default_body_view.name)
+ r.append(":%s]" % self.master.options.default_contentview)
opts = []
if self.master.options.anticache:
diff --git a/test/mitmproxy/test_contentview.py b/test/mitmproxy/test_contentview.py
index b0e77ce1..e7d8b1f7 100644
--- a/test/mitmproxy/test_contentview.py
+++ b/test/mitmproxy/test_contentview.py
@@ -233,19 +233,19 @@ def test_get_content_view():
def test_get_message_content_view():
r = mitmproxy.test.tutils.treq()
- desc, lines, err = cv.get_message_content_view(cv.get("Raw"), r)
+ desc, lines, err = cv.get_message_content_view("raw", r)
assert desc == "Raw"
r.encode("gzip")
- desc, lines, err = cv.get_message_content_view(cv.get("Raw"), r)
+ desc, lines, err = cv.get_message_content_view("raw", r)
assert desc == "[decoded gzip] Raw"
r.headers["content-encoding"] = "deflate"
- desc, lines, err = cv.get_message_content_view(cv.get("Raw"), r)
+ desc, lines, err = cv.get_message_content_view("raw", r)
assert desc == "[cannot decode] Raw"
r.content = None
- desc, lines, err = cv.get_message_content_view(cv.get("Raw"), r)
+ desc, lines, err = cv.get_message_content_view("raw", r)
assert list(lines) == [[("error", "content missing")]]