diff options
Diffstat (limited to 'mitmproxy/console/grideditor/col_text.py')
-rw-r--r-- | mitmproxy/console/grideditor/col_text.py | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/mitmproxy/console/grideditor/col_text.py b/mitmproxy/console/grideditor/col_text.py new file mode 100644 index 00000000..d60dc854 --- /dev/null +++ b/mitmproxy/console/grideditor/col_text.py @@ -0,0 +1,55 @@ +""" +Welcome to the encoding dance! + +In a nutshell, text columns are actually a proxy class for byte columns, +which just encode/decodes contents. +""" +from __future__ import absolute_import, print_function, division + +from mitmproxy.console import signals +from mitmproxy.console.grideditor import col_bytes + + +class Column(col_bytes.Column): + def __init__(self, heading, encoding="utf8", errors="surrogateescape"): + super(Column, self).__init__(heading) + self.encoding_args = encoding, errors + + def Display(self, data): + return TDisplay(data, self.encoding_args) + + def Edit(self, data): + return TEdit(data, self.encoding_args) + + def blank(self): + return u"" + + +# This is the same for both edit and display. +class EncodingMixin(object): + def __init__(self, data, encoding_args): + # type: (str) -> TDisplay + self.encoding_args = encoding_args + data = data.encode(*self.encoding_args) + super(EncodingMixin, self).__init__(data) + + def get_data(self): + data = super(EncodingMixin, self).get_data() + try: + return data.decode(*self.encoding_args) + except ValueError: + signals.status_message.send( + self, + message="Invalid encoding.", + expire=1000 + ) + raise + + +# urwid forces a different name for a subclass. +class TDisplay(EncodingMixin, col_bytes.Display): + pass + + +class TEdit(EncodingMixin, col_bytes.Edit): + pass |