aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/tools/console/flowview.py
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2020-05-03 10:51:10 +0200
committerGitHub <noreply@github.com>2020-05-03 10:51:10 +0200
commitf4aa3ee11c01d5b8f260e57bfd7e084b7767c08e (patch)
tree9befc172c55f736ff3c3394b0fa6ab88fea90313 /mitmproxy/tools/console/flowview.py
parenta802899491ba87218d7878bc4ac73dcf59c9275e (diff)
parentfe75f14ea29d0654c3a688ecc4c3669a946ea2a8 (diff)
downloadmitmproxy-f4aa3ee11c01d5b8f260e57bfd7e084b7767c08e.tar.gz
mitmproxy-f4aa3ee11c01d5b8f260e57bfd7e084b7767c08e.tar.bz2
mitmproxy-f4aa3ee11c01d5b8f260e57bfd7e084b7767c08e.zip
Merge pull request #3970 from nikitastupin/master
Integrate contentviews to TCP flow details
Diffstat (limited to 'mitmproxy/tools/console/flowview.py')
-rw-r--r--mitmproxy/tools/console/flowview.py50
1 files changed, 41 insertions, 9 deletions
diff --git a/mitmproxy/tools/console/flowview.py b/mitmproxy/tools/console/flowview.py
index 3fef70ce..466ff0c2 100644
--- a/mitmproxy/tools/console/flowview.py
+++ b/mitmproxy/tools/console/flowview.py
@@ -108,6 +108,26 @@ class FlowDetails(tabs.Tabs):
assert isinstance(flow, http.HTTPFlow)
return self.conn_text(flow.response)
+ def _contentview_status_bar(self, description: str, viewmode: str):
+ cols = [
+ urwid.Text(
+ [
+ ("heading", description),
+ ]
+ ),
+ urwid.Text(
+ [
+ " ",
+ ('heading', "["),
+ ('heading_key', "m"),
+ ('heading', (":%s]" % viewmode)),
+ ],
+ align="right"
+ )
+ ]
+ contentview_status_bar = urwid.AttrWrap(urwid.Columns(cols), "heading")
+ return contentview_status_bar
+
def view_tcp_stream(self) -> urwid.Widget:
flow = self.flow
assert isinstance(flow, tcp.TCPFlow)
@@ -115,6 +135,10 @@ class FlowDetails(tabs.Tabs):
if not flow.messages:
return searchable.Searchable([urwid.Text(("highlight", "No messages."))])
+ viewmode = self.master.commands.call("console.flowview.mode")
+
+ # Merge adjacent TCP "messages". For detailed explanation of this code block see:
+ # https://github.com/mitmproxy/mitmproxy/pull/3970/files/469bd32582f764f9a29607efa4f5b04bd87961fb#r418670880
from_client = None
messages = []
for message in flow.messages:
@@ -124,17 +148,25 @@ class FlowDetails(tabs.Tabs):
else:
messages[-1] += message.content
+ widget_lines = []
+
from_client = flow.messages[0].from_client
- parts = []
- for message in messages:
- parts.append(
- (
- "head" if from_client else "key",
- message
- )
- )
+ for m in messages:
+ _, lines, _ = contentviews.get_tcp_content_view(viewmode, m)
+
+ for line in lines:
+ if from_client:
+ line.insert(0, ("from_client", f"{common.SYMBOL_FROM_CLIENT} "))
+ else:
+ line.insert(0, ("to_client", f"{common.SYMBOL_TO_CLIENT} "))
+
+ widget_lines.append(urwid.Text(line))
+
from_client = not from_client
- return searchable.Searchable([urwid.Text(parts)])
+
+ widget_lines.insert(0, self._contentview_status_bar(viewmode.capitalize(), viewmode))
+
+ return searchable.Searchable(widget_lines)
def view_details(self):
return flowdetailview.flowdetails(self.view, self.flow)