diff options
Diffstat (limited to 'mitmproxy/addons/view.py')
-rw-r--r-- | mitmproxy/addons/view.py | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/mitmproxy/addons/view.py b/mitmproxy/addons/view.py index 1d57d781..4d0a7ef9 100644 --- a/mitmproxy/addons/view.py +++ b/mitmproxy/addons/view.py @@ -21,7 +21,10 @@ from mitmproxy import command from mitmproxy import connections from mitmproxy import ctx from mitmproxy import io -from mitmproxy import http # noqa +from mitmproxy import http +from mitmproxy import tcp +from mitmproxy.utils import human + # The underlying sorted list implementation expects the sort key to be stable # for the lifetime of the object. However, if we sort by size, for instance, @@ -38,7 +41,7 @@ class _OrderKey: def __init__(self, view): self.view = view - def generate(self, f: http.HTTPFlow) -> typing.Any: # pragma: no cover + def generate(self, f: mitmproxy.flow.Flow) -> typing.Any: # pragma: no cover pass def refresh(self, f): @@ -68,32 +71,49 @@ class _OrderKey: class OrderRequestStart(_OrderKey): - def generate(self, f: http.HTTPFlow) -> int: - return f.request.timestamp_start or 0 + def generate(self, f: mitmproxy.flow.Flow) -> float: + return f.timestamp_start class OrderRequestMethod(_OrderKey): - def generate(self, f: http.HTTPFlow) -> str: - return f.request.method + def generate(self, f: mitmproxy.flow.Flow) -> str: + if isinstance(f, http.HTTPFlow): + return f.request.method + elif isinstance(f, tcp.TCPFlow): + return "TCP" + else: + raise NotImplementedError() class OrderRequestURL(_OrderKey): - def generate(self, f: http.HTTPFlow) -> str: - return f.request.url + def generate(self, f: mitmproxy.flow.Flow) -> str: + if isinstance(f, http.HTTPFlow): + return f.request.url + elif isinstance(f, tcp.TCPFlow): + return human.format_address(f.server_conn.address) + else: + raise NotImplementedError() class OrderKeySize(_OrderKey): - def generate(self, f: http.HTTPFlow) -> int: - s = 0 - if f.request.raw_content: - s += len(f.request.raw_content) - if f.response and f.response.raw_content: - s += len(f.response.raw_content) - return s - + def generate(self, f: mitmproxy.flow.Flow) -> int: + if isinstance(f, http.HTTPFlow): + size = 0 + if f.request.raw_content: + size += len(f.request.raw_content) + if f.response and f.response.raw_content: + size += len(f.response.raw_content) + return size + elif isinstance(f, tcp.TCPFlow): + size = 0 + for message in f.messages: + size += len(message.content) + return size + else: + raise NotImplementedError() -matchall = flowfilter.parse(".") +matchall = flowfilter.parse("~http | ~tcp") orders = [ ("t", "time"), @@ -555,6 +575,18 @@ class View(collections.abc.Sequence): def kill(self, f): self.update([f]) + def tcp_start(self, f): + self.add([f]) + + def tcp_message(self, f): + self.update([f]) + + def tcp_error(self, f): + self.update([f]) + + def tcp_end(self, f): + self.update([f]) + def update(self, flows: typing.Sequence[mitmproxy.flow.Flow]) -> None: """ Updates a list of flows. If flow is not in the state, it's ignored. |