diff options
Diffstat (limited to 'libmproxy/console/grideditor.py')
-rw-r--r-- | libmproxy/console/grideditor.py | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/libmproxy/console/grideditor.py b/libmproxy/console/grideditor.py index e406fbaf..e5e64403 100644 --- a/libmproxy/console/grideditor.py +++ b/libmproxy/console/grideditor.py @@ -7,7 +7,7 @@ import urwid from . import common, signals from .. import utils, filt, script -from netlib import http_uastrings, http_cookies +from netlib import http_uastrings, http_cookies, odict FOOTER = [ @@ -231,8 +231,10 @@ class GridWalker(urwid.ListWalker): def _insert(self, pos): self.focus = pos self.lst.insert( - self.focus, [ - [c.blank() for c in self.editor.columns], set([])] + self.focus, + [ + [c.blank() for c in self.editor.columns], set([]) + ] ) self.focus_col = 0 self.start_edit() @@ -318,7 +320,7 @@ class GridEditor(urwid.WidgetWrap): columns = None def __init__(self, master, value, callback, *cb_args, **cb_kwargs): - value = copy.deepcopy(value) + value = self.data_in(copy.deepcopy(value)) self.master, self.value, self.callback = master, value, callback self.cb_args, self.cb_kwargs = cb_args, cb_kwargs @@ -410,7 +412,7 @@ class GridEditor(urwid.WidgetWrap): for i in self.walker.lst: if not i[1] and any([x for x in i[0]]): res.append(i[0]) - self.callback(res, *self.cb_args, **self.cb_kwargs) + self.callback(self.data_out(res), *self.cb_args, **self.cb_kwargs) signals.pop_view_state.send(self) elif key in ["h", "left"]: self.walker.left() @@ -427,6 +429,19 @@ class GridEditor(urwid.WidgetWrap): elif column.keypress(key, self) and not self.handle_key(key): return self._w.keypress(size, key) + def data_out(self, data): + """ + Called on raw list data, before data is returned through the + callback. + """ + return data + + def data_in(self, data): + """ + Called to prepare provided data. + """ + return data + def is_error(self, col, val): """ Return False, or a string error message. @@ -597,6 +612,12 @@ class PathEditor(GridEditor): TextColumn("Component"), ] + def data_in(self, data): + return [[i] for i in data] + + def data_out(self, data): + return [i[0] for i in data] + class ScriptEditor(GridEditor): title = "Editing scripts" @@ -623,6 +644,12 @@ class HostPatternEditor(GridEditor): except re.error as e: return "Invalid regex: %s" % str(e) + def data_in(self, data): + return [[i] for i in data] + + def data_out(self, data): + return [i[0] for i in data] + class CookieEditor(GridEditor): title = "Editing request Cookie header" @@ -639,6 +666,15 @@ class CookieAttributeEditor(GridEditor): TextColumn("Value"), ] + def data_out(self, data): + ret = [] + for i in data: + if not i[1]: + ret.append([i[0], None]) + else: + ret.append(i) + return ret + class SetCookieEditor(GridEditor): title = "Editing response SetCookie header" @@ -647,3 +683,20 @@ class SetCookieEditor(GridEditor): TextColumn("Value"), SubgridColumn("Attributes", CookieAttributeEditor), ] + + def data_in(self, data): + flattened = [] + for k, v in data.items(): + flattened.append([k, v[0], v[1].lst]) + return flattened + + def data_out(self, data): + vals = [] + for i in data: + vals.append( + [ + i[0], + [i[1], odict.ODictCaseless(i[2])] + ] + ) + return odict.ODict(vals) |