diff options
-rw-r--r-- | mitmproxy/addons/view.py | 13 | ||||
-rw-r--r-- | mitmproxy/tools/cmdline.py | 4 | ||||
-rw-r--r-- | mitmproxy/tools/console/flowlist.py | 33 | ||||
-rw-r--r-- | mitmproxy/tools/console/master.py | 7 | ||||
-rw-r--r-- | mitmproxy/tools/console/statusbar.py | 2 | ||||
-rw-r--r-- | mitmproxy/tools/main.py | 2 | ||||
-rw-r--r-- | test/mitmproxy/addons/test_view.py | 5 |
7 files changed, 40 insertions, 26 deletions
diff --git a/mitmproxy/addons/view.py b/mitmproxy/addons/view.py index b4ba2315..9d38d94c 100644 --- a/mitmproxy/addons/view.py +++ b/mitmproxy/addons/view.py @@ -61,6 +61,8 @@ class View(collections.Sequence): self.show_marked = False self.order_key = key_request_start self.order_reversed = False + self.focus_follow = False + self._view = sortedcontainers.SortedListWithKey(key = self.order_key) # These signals broadcast events that affect the view. That is, an @@ -115,6 +117,9 @@ class View(collections.Sequence): def index(self, f: mitmproxy.flow.Flow) -> int: return self._rev(self._view.index(f)) + def __contains__(self, f: mitmproxy.flow.Flow) -> bool: + return self._view.__contains__(f) + def _refilter(self): self._view.clear() for i in self._store.values(): @@ -166,6 +171,8 @@ class View(collections.Sequence): self._store[f.id] = f if self.filter(f): self._view.add(f) + if self.focus_follow: + self.focus.flow = f self.sig_add.send(self, flow=f) def remove(self, f: mitmproxy.flow.Flow): @@ -186,6 +193,8 @@ class View(collections.Sequence): if self.filter(f): if f not in self._view: self._view.add(f) + if self.focus_follow: + self.focus.flow = f self.sig_add.send(self, flow=f) else: self.sig_update.send(self, flow=f) @@ -222,6 +231,8 @@ class View(collections.Sequence): ) if "order_reversed" in updated: self.set_reversed(opts.order_reversed) + if "focus_follow" in updated: + self.focus_follow = opts.focus_follow def request(self, f): self.add(f) @@ -258,7 +269,7 @@ class Focus: return self._flow @flow.setter - def flow(self, f: mitmproxy.flow.Flow): + def flow(self, f: typing.Optional[mitmproxy.flow.Flow]): if f is not None and f not in self.view: raise ValueError("Attempt to set focus to flow not in view") self._flow = f diff --git a/mitmproxy/tools/cmdline.py b/mitmproxy/tools/cmdline.py index cf6e1d35..e4b29d0f 100644 --- a/mitmproxy/tools/cmdline.py +++ b/mitmproxy/tools/cmdline.py @@ -784,8 +784,8 @@ def mitmproxy(): ) parser.add_argument( "--follow", - action="store_true", dest="follow", - help="Follow flow list." + action="store_true", dest="focus_follow", + help="Focus follows new flows." ) parser.add_argument( "--order", diff --git a/mitmproxy/tools/console/flowlist.py b/mitmproxy/tools/console/flowlist.py index a0a3dc94..76545893 100644 --- a/mitmproxy/tools/console/flowlist.py +++ b/mitmproxy/tools/console/flowlist.py @@ -175,18 +175,6 @@ class FlowItem(urwid.WidgetWrap): signals.flowlist_change.send(self) elif key == "M": self.master.view.toggle_marked() - elif key == "o": - orders = [(i[1], i[0]) for i in view.orders] - lookup = dict([(i[0], i[1]) for i in view.orders]) - - def change_order(k): - self.master.options.order = lookup[k] - - signals.status_prompt_onekey.send( - prompt = "Order", - keys = orders, - callback = change_order - ) elif key == "r": try: self.master.replay_request(self.flow) @@ -220,9 +208,6 @@ class FlowItem(urwid.WidgetWrap): for f in self.master.view: f.marked = False signals.flowlist_change.send(self) - elif key == "v": - val = not self.master.options.order_reversed - self.master.options.order_reversed = val elif key == "V": if not self.flow.modified(): signals.status_message.send(message="Flow not modified.") @@ -389,8 +374,24 @@ class FlowListBox(urwid.ListBox): keys = common.METHOD_OPTIONS, callback = self.get_method ) + elif key == "o": + orders = [(i[1], i[0]) for i in view.orders] + lookup = dict([(i[0], i[1]) for i in view.orders]) + + def change_order(k): + self.master.options.order = lookup[k] + + signals.status_prompt_onekey.send( + prompt = "Order", + keys = orders, + callback = change_order + ) elif key == "F": - self.master.toggle_follow_flows() + o = self.master.options + o.focus_follow = not o.focus_follow + elif key == "v": + val = not self.master.options.order_reversed + self.master.options.order_reversed = val elif key == "W": if self.master.options.outfile: self.master.options.outfile = None diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py index 932dc151..4c5e8c8c 100644 --- a/mitmproxy/tools/console/master.py +++ b/mitmproxy/tools/console/master.py @@ -44,25 +44,23 @@ class Options(mitmproxy.options.Options): self, *, # all args are keyword-only. eventlog: bool = False, - follow: bool = False, + focus_follow: bool = False, intercept: Optional[str] = None, filter: Optional[str] = None, palette: Optional[str] = None, palette_transparent: bool = False, no_mouse: bool = False, - follow_focus: bool = False, order: Optional[str] = None, order_reversed: bool = False, **kwargs ): self.eventlog = eventlog - self.follow = follow + self.focus_follow = focus_follow self.intercept = intercept self.filter = filter self.palette = palette self.palette_transparent = palette_transparent self.no_mouse = no_mouse - self.follow_focus = follow_focus self.order = order self.order_reversed = order_reversed super().__init__(**kwargs) @@ -83,7 +81,6 @@ class ConsoleMaster(master.Master): self.palette_transparent = options.palette_transparent self.logbuffer = urwid.SimpleListWalker([]) - self.follow = options.follow self.view_stack = [] diff --git a/mitmproxy/tools/console/statusbar.py b/mitmproxy/tools/console/statusbar.py index b358f711..e292cbd7 100644 --- a/mitmproxy/tools/console/statusbar.py +++ b/mitmproxy/tools/console/statusbar.py @@ -199,7 +199,7 @@ class StatusBar(urwid.WidgetWrap): opts.append("killextra") if self.master.options.no_upstream_cert: opts.append("no-upstream-cert") - if self.master.options.follow_focus: + if self.master.options.focus_follow: opts.append("following") if self.master.options.stream_large_bodies: opts.append( diff --git a/mitmproxy/tools/main.py b/mitmproxy/tools/main.py index 772841f5..08e5f2ca 100644 --- a/mitmproxy/tools/main.py +++ b/mitmproxy/tools/main.py @@ -69,7 +69,7 @@ def mitmproxy(args=None): # pragma: no cover console_options.palette = args.palette console_options.palette_transparent = args.palette_transparent console_options.eventlog = args.eventlog - console_options.follow = args.follow + console_options.focus_follow = args.focus_follow console_options.intercept = args.intercept console_options.filter = args.filter console_options.no_mouse = args.no_mouse diff --git a/test/mitmproxy/addons/test_view.py b/test/mitmproxy/addons/test_view.py index 750e8469..77a8da30 100644 --- a/test/mitmproxy/addons/test_view.py +++ b/test/mitmproxy/addons/test_view.py @@ -7,6 +7,11 @@ from mitmproxy.test import taddons from .. import tutils +def test_keys(): + t = tflow.tflow(resp=True) + view.key_size(t) + + def test_simple(): v = view.View() f = tflow.tflow() |