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() | 
