diff options
author | Maximilian Hils <git@maximilianhils.com> | 2020-05-03 10:51:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-03 10:51:10 +0200 |
commit | f4aa3ee11c01d5b8f260e57bfd7e084b7767c08e (patch) | |
tree | 9befc172c55f736ff3c3394b0fa6ab88fea90313 /mitmproxy/tools/console/flowview.py | |
parent | a802899491ba87218d7878bc4ac73dcf59c9275e (diff) | |
parent | fe75f14ea29d0654c3a688ecc4c3669a946ea2a8 (diff) | |
download | mitmproxy-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.py | 50 |
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) |