aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/tools/console/flowview.py
diff options
context:
space:
mode:
Diffstat (limited to 'mitmproxy/tools/console/flowview.py')
-rw-r--r--mitmproxy/tools/console/flowview.py94
1 files changed, 69 insertions, 25 deletions
diff --git a/mitmproxy/tools/console/flowview.py b/mitmproxy/tools/console/flowview.py
index fd41da0d..3fef70ce 100644
--- a/mitmproxy/tools/console/flowview.py
+++ b/mitmproxy/tools/console/flowview.py
@@ -5,9 +5,11 @@ from typing import Optional, Union # noqa
import urwid
+import mitmproxy.flow
from mitmproxy import contentviews
from mitmproxy import ctx
from mitmproxy import http
+from mitmproxy import tcp
from mitmproxy.tools.console import common
from mitmproxy.tools.console import layoutwidget
from mitmproxy.tools.console import flowdetailview
@@ -24,8 +26,8 @@ class SearchError(Exception):
class FlowViewHeader(urwid.WidgetWrap):
def __init__(
- self,
- master: "mitmproxy.tools.console.master.ConsoleMaster",
+ self,
+ master: "mitmproxy.tools.console.master.ConsoleMaster",
) -> None:
self.master = master
self.focus_changed()
@@ -35,11 +37,8 @@ class FlowViewHeader(urwid.WidgetWrap):
if self.master.view.focus.flow:
self._w = common.format_flow(
self.master.view.focus.flow,
- False,
- extended=True,
+ render_mode=common.RenderMode.DETAILVIEW,
hostheader=self.master.options.showhost,
- cols=cols,
- layout=self.master.options.console_flowlist_layout
)
else:
self._w = urwid.Pile([])
@@ -52,45 +51,90 @@ class FlowDetails(tabs.Tabs):
self.show()
self.last_displayed_body = None
- def focus_changed(self):
- if self.master.view.focus.flow:
- self.tabs = [
- (self.tab_request, self.view_request),
- (self.tab_response, self.view_response),
- (self.tab_details, self.view_details),
- ]
- self.show()
- else:
- self.master.window.pop()
-
@property
def view(self):
return self.master.view
@property
- def flow(self):
+ def flow(self) -> mitmproxy.flow.Flow:
return self.master.view.focus.flow
- def tab_request(self):
- if self.flow.intercepted and not self.flow.response:
+ def focus_changed(self):
+ if self.flow:
+ if isinstance(self.flow, http.HTTPFlow):
+ self.tabs = [
+ (self.tab_http_request, self.view_request),
+ (self.tab_http_response, self.view_response),
+ (self.tab_details, self.view_details),
+ ]
+ elif isinstance(self.flow, tcp.TCPFlow):
+ self.tabs = [
+ (self.tab_tcp_stream, self.view_tcp_stream),
+ (self.tab_details, self.view_details),
+ ]
+ self.show()
+ else:
+ self.master.window.pop()
+
+ def tab_http_request(self):
+ flow = self.flow
+ assert isinstance(flow, http.HTTPFlow)
+ if self.flow.intercepted and not flow.response:
return "Request intercepted"
else:
return "Request"
- def tab_response(self):
- if self.flow.intercepted and self.flow.response:
+ def tab_http_response(self):
+ flow = self.flow
+ assert isinstance(flow, http.HTTPFlow)
+ if self.flow.intercepted and flow.response:
return "Response intercepted"
else:
return "Response"
+ def tab_tcp_stream(self):
+ return "TCP Stream"
+
def tab_details(self):
return "Detail"
def view_request(self):
- return self.conn_text(self.flow.request)
+ flow = self.flow
+ assert isinstance(flow, http.HTTPFlow)
+ return self.conn_text(flow.request)
def view_response(self):
- return self.conn_text(self.flow.response)
+ flow = self.flow
+ assert isinstance(flow, http.HTTPFlow)
+ return self.conn_text(flow.response)
+
+ def view_tcp_stream(self) -> urwid.Widget:
+ flow = self.flow
+ assert isinstance(flow, tcp.TCPFlow)
+
+ if not flow.messages:
+ return searchable.Searchable([urwid.Text(("highlight", "No messages."))])
+
+ from_client = None
+ messages = []
+ for message in flow.messages:
+ if message.from_client is not from_client:
+ messages.append(message.content)
+ from_client = message.from_client
+ else:
+ messages[-1] += message.content
+
+ from_client = flow.messages[0].from_client
+ parts = []
+ for message in messages:
+ parts.append(
+ (
+ "head" if from_client else "key",
+ message
+ )
+ )
+ from_client = not from_client
+ return searchable.Searchable([urwid.Text(parts)])
def view_details(self):
return flowdetailview.flowdetails(self.view, self.flow)
@@ -229,7 +273,7 @@ class FlowView(urwid.Frame, layoutwidget.LayoutWidget):
def __init__(self, master):
super().__init__(
FlowDetails(master),
- header = FlowViewHeader(master),
+ header=FlowViewHeader(master),
)
self.master = master