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