diff options
| author | Aldo Cortesi <aldo@corte.si> | 2017-06-11 11:47:04 +1200 | 
|---|---|---|
| committer | Aldo Cortesi <aldo@corte.si> | 2017-06-11 11:47:04 +1200 | 
| commit | d7cc7e62a28378436dafde91b646da9852d8e5dc (patch) | |
| tree | 7e813eb1c66dd98bcfa3c344a51243aa3e90c2d2 | |
| parent | f804495fd84a689bd397b0f4b1ccc2346385dbd9 (diff) | |
| download | mitmproxy-d7cc7e62a28378436dafde91b646da9852d8e5dc.tar.gz mitmproxy-d7cc7e62a28378436dafde91b646da9852d8e5dc.tar.bz2 mitmproxy-d7cc7e62a28378436dafde91b646da9852d8e5dc.zip | |
console: grideditor keybindings for r, R and e
| -rw-r--r-- | mitmproxy/tools/console/grideditor/base.py | 68 | ||||
| -rw-r--r-- | mitmproxy/tools/console/grideditor/col_bytes.py | 49 | ||||
| -rw-r--r-- | mitmproxy/tools/console/master.py | 25 | 
3 files changed, 72 insertions, 70 deletions
| diff --git a/mitmproxy/tools/console/grideditor/base.py b/mitmproxy/tools/console/grideditor/base.py index 722fce55..b956e59d 100644 --- a/mitmproxy/tools/console/grideditor/base.py +++ b/mitmproxy/tools/console/grideditor/base.py @@ -1,15 +1,11 @@  import abc  import copy -from typing import Any -from typing import Callable -from typing import Container -from typing import Iterable -from typing import Optional -from typing import Sequence -from typing import Tuple -from typing import Set # noqa - +import os +import typing  import urwid + +from mitmproxy.utils import strutils +from mitmproxy import exceptions  from mitmproxy.tools.console import common  from mitmproxy.tools.console import signals  from mitmproxy.tools.console import layoutwidget @@ -24,6 +20,21 @@ FOOTER_EDITING = [  ] +def read_file(filename: str, escaped: bool) -> typing.AnyStr: +    filename = os.path.expanduser(filename) +    try: +        with open(filename, "r" if escaped else "rb") as f: +            d = f.read() +    except IOError as v: +        raise exceptions.CommandError(v) +    if escaped: +        try: +            d = strutils.escaped_str_to_bytes(d) +        except ValueError: +            raise exceptions.CommandError("Invalid Python-style string encoding.") +    return d + +  class Cell(urwid.WidgetWrap):      def get_data(self):          """ @@ -51,10 +62,10 @@ class Column(metaclass=abc.ABCMeta):          pass      @abc.abstractmethod -    def blank(self) -> Any: +    def blank(self) -> typing.Any:          pass -    def keypress(self, key: str, editor: "GridEditor") -> Optional[str]: +    def keypress(self, key: str, editor: "GridEditor") -> typing.Optional[str]:          return key @@ -62,10 +73,10 @@ class GridRow(urwid.WidgetWrap):      def __init__(              self, -            focused: Optional[int], +            focused: typing.Optional[int],              editing: bool,              editor: "GridEditor", -            values: Tuple[Iterable[bytes], Container[int]] +            values: typing.Tuple[typing.Iterable[bytes], typing.Container[int]]      ) -> None:          self.focused = focused          self.editor = editor @@ -118,7 +129,7 @@ class GridWalker(urwid.ListWalker):      def __init__(              self, -            lst: Iterable[list], +            lst: typing.Iterable[list],              editor: "GridEditor"      ) -> None:          self.lst = [(i, set()) for i in lst]  # type: Sequence[Tuple[Any, Set]] @@ -262,8 +273,8 @@ class BaseGridEditor(urwid.WidgetWrap):              master: "mitmproxy.tools.console.master.ConsoleMaster",              title,              columns, -            value: Any, -            callback: Callable[..., None], +            value: typing.Any, +            callback: typing.Callable[..., None],              *cb_args,              **cb_kwargs      ) -> None: @@ -352,20 +363,20 @@ class BaseGridEditor(urwid.WidgetWrap):          elif column.keypress(key, self) and not self.handle_key(key):              return self._w.keypress(size, key) -    def data_out(self, data: Sequence[list]) -> Any: +    def data_out(self, data: typing.Sequence[list]) -> typing.Any:          """              Called on raw list data, before data is returned through the              callback.          """          return data -    def data_in(self, data: Any) -> Iterable[list]: +    def data_in(self, data: typing.Any) -> typing.Iterable[list]:          """              Called to prepare provided data.          """          return data -    def is_error(self, col: int, val: Any) -> Optional[str]: +    def is_error(self, col: int, val: typing.Any) -> typing.Optional[str]:          """              Return None, or a string error message.          """ @@ -415,6 +426,19 @@ class BaseGridEditor(urwid.WidgetWrap):      def cmd_delete(self):          self.walker.delete_focus() +    def cmd_read_file(self, path): +        self.walker.set_current_value(read_file(path, False)) + +    def cmd_read_file_escaped(self, path): +        self.walker.set_current_value(read_file(path, True)) + +    def cmd_spawn_editor(self): +        o = self.walker.get_current_value() +        if o is not None: +            n = self.master.spawn_editor(o) +            n = strutils.clean_hanging_newline(n) +            self.walker.set_current_value(n) +  class GridEditor(BaseGridEditor):      title = None  # type: str @@ -424,8 +448,8 @@ class GridEditor(BaseGridEditor):      def __init__(              self,              master: "mitmproxy.tools.console.master.ConsoleMaster", -            value: Any, -            callback: Callable[..., None], +            value: typing.Any, +            callback: typing.Callable[..., None],              *cb_args,              **cb_kwargs      ) -> None: @@ -480,7 +504,7 @@ class FocusEditor(urwid.WidgetWrap, layoutwidget.LayoutWidget):      def focus_changed(self):          if self.master.view.focus.flow:              self._w = BaseGridEditor( -                self.master.view.focus.flow, +                self.master,                  self.title,                  self.columns,                  self.get_data(self.master.view.focus.flow), diff --git a/mitmproxy/tools/console/grideditor/col_bytes.py b/mitmproxy/tools/console/grideditor/col_bytes.py index e4a53453..227eb525 100644 --- a/mitmproxy/tools/console/grideditor/col_bytes.py +++ b/mitmproxy/tools/console/grideditor/col_bytes.py @@ -1,34 +1,9 @@ -import os -from typing import Callable, Optional -  import urwid  from mitmproxy.tools.console import signals  from mitmproxy.tools.console.grideditor import base  from mitmproxy.utils import strutils -def read_file(filename: str, callback: Callable[..., None], escaped: bool) -> Optional[str]: -    if not filename: -        return None - -    filename = os.path.expanduser(filename) -    try: -        with open(filename, "r" if escaped else "rb") as f: -            d = f.read() -    except IOError as v: -        return str(v) - -    if escaped: -        try: -            d = strutils.escaped_str_to_bytes(d) -        except ValueError: -            return "Invalid Python-style string encoding." -    # TODO: Refactor the status_prompt_path signal so that we -    # can raise exceptions here and return the content instead. -    callback(d) -    return None - -  class Column(base.Column):      def Display(self, data):          return Display(data) @@ -40,29 +15,7 @@ class Column(base.Column):          return b""      def keypress(self, key, editor): -        if key == "r": -            if editor.walker.get_current_value() is not None: -                signals.status_prompt_path.send( -                    self, -                    prompt="Read file", -                    callback=read_file, -                    args=(editor.walker.set_current_value, True) -                ) -        elif key == "R": -            if editor.walker.get_current_value() is not None: -                signals.status_prompt_path.send( -                    self, -                    prompt="Read unescaped file", -                    callback=read_file, -                    args=(editor.walker.set_current_value, False) -                ) -        elif key == "e": -            o = editor.walker.get_current_value() -            if o is not None: -                n = editor.master.spawn_editor(o) -                n = strutils.clean_hanging_newline(n) -                editor.walker.set_current_value(n) -        elif key in ["enter"]: +        if key in ["enter"]:              editor.walker.start_edit()          else:              return key diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py index 6c1f3243..038e76b2 100644 --- a/mitmproxy/tools/console/master.py +++ b/mitmproxy/tools/console/master.py @@ -356,6 +356,28 @@ class ConsoleAddon:          """          self._grideditor().cmd_delete() +    @command.command("console.grideditor.readfile") +    def grideditor_readfile(self, path: str) -> None: +        """ +            Read a file into the currrent cell. +        """ +        self._grideditor().cmd_read_file(path) + +    @command.command("console.grideditor.readfile_escaped") +    def grideditor_readfile_escaped(self, path: str) -> None: +        """ +            Read a file containing a Python-style escaped stringinto the +            currrent cell. +        """ +        self._grideditor().cmd_read_file_escaped(path) + +    @command.command("console.grideditor.editor") +    def grideditor_editor(self) -> None: +        """ +            Spawn an external editor on the current cell. +        """ +        self._grideditor().cmd_spawn_editor() +      @command.command("console.flowview.mode.set")      def flowview_mode_set(self) -> None:          """ @@ -514,6 +536,9 @@ def default_keymap(km):      km.add("A", "console.grideditor.insert", ["grideditor"])      km.add("tab", "console.grideditor.next", ["grideditor"])      km.add("d", "console.grideditor.delete", ["grideditor"]) +    km.add("r", "console.command console.grideditor.readfile", ["grideditor"]) +    km.add("R", "console.command console.grideditor.readfile_escaped", ["grideditor"]) +    km.add("e", "console.grideditor.editor", ["grideditor"])  class ConsoleMaster(master.Master): | 
