aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/console/help.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2012-02-07 16:39:37 +1300
committerAldo Cortesi <aldo@nullcube.com>2012-02-07 16:39:37 +1300
commitcdd5a53767e51a6d992bf8d08df2733e7af916b8 (patch)
treebe7d42be2960ef42675779d1494a1f5469199be5 /libmproxy/console/help.py
parentf7b3a6d571059aef84e26ac82b9cc67a081230f6 (diff)
downloadmitmproxy-cdd5a53767e51a6d992bf8d08df2733e7af916b8.tar.gz
mitmproxy-cdd5a53767e51a6d992bf8d08df2733e7af916b8.tar.bz2
mitmproxy-cdd5a53767e51a6d992bf8d08df2733e7af916b8.zip
Refactor console.
Split the console implementation out into logical components.
Diffstat (limited to 'libmproxy/console/help.py')
-rw-r--r--libmproxy/console/help.py146
1 files changed, 146 insertions, 0 deletions
diff --git a/libmproxy/console/help.py b/libmproxy/console/help.py
new file mode 100644
index 00000000..574dd7ca
--- /dev/null
+++ b/libmproxy/console/help.py
@@ -0,0 +1,146 @@
+import urwid
+import common
+from .. import filt
+
+class HelpView(urwid.ListBox):
+ def __init__(self, master):
+ self.master = master
+ urwid.ListBox.__init__(
+ self,
+ self.helptext()
+ )
+
+ def keypress(self, size, key):
+ key = common.shortcuts(key)
+ if key == "q":
+ self.master.pop_view()
+ return None
+ return urwid.ListBox.keypress(self, size, key)
+
+ def helptext(self):
+ text = []
+ text.append(("head", "Global keys:\n"))
+ keys = [
+ ("A", "accept all intercepted connections"),
+ ("a", "accept this intercepted connection"),
+ ("c", "client replay"),
+ ("i", "set interception pattern"),
+ ("j, k", "up, down"),
+ ("l", "set limit filter pattern"),
+ ("L", "load saved flows"),
+
+ ("m", "change body display mode"),
+ (None,
+ common.highlight_key("raw", "r") +
+ [("text", ": raw data")]
+ ),
+ (None,
+ common.highlight_key("pretty", "p") +
+ [("text", ": pretty-print XML, HTML and JSON")]
+ ),
+ (None,
+ common.highlight_key("hex", "h") +
+ [("text", ": hex dump")]
+ ),
+
+ ("o", "toggle options:"),
+ (None,
+ common.highlight_key("anticache", "a") +
+ [("text", ": prevent cached responses")]
+ ),
+ (None,
+ common.highlight_key("anticomp", "c") +
+ [("text", ": prevent compressed responses")]
+ ),
+ (None,
+ common.highlight_key("killextra", "k") +
+ [("text", ": kill requests not part of server replay")]
+ ),
+ (None,
+ common.highlight_key("norefresh", "n") +
+ [("text", ": disable server replay response refresh")]
+ ),
+
+ ("q", "quit / return to connection list"),
+ ("Q", "quit without confirm prompt"),
+ ("r", "replay request"),
+ ("R", "revert changes to request"),
+ ("s", "set/unset script"),
+ ("S", "server replay"),
+ ("t", "set sticky cookie expression"),
+ ("u", "set sticky auth expression"),
+ ("w", "save all flows matching current limit"),
+ ("W", "save this flow"),
+ ("|", "run script on this flow"),
+ ("space", "page down"),
+ ("pg up/down", "page up/down"),
+ ]
+ text.extend(common.format_keyvals(keys, key="key", val="text", indent=4))
+
+ text.append(("head", "\n\nConnection list keys:\n"))
+ keys = [
+ ("C", "clear connection list or eventlog"),
+ ("d", "delete connection from view"),
+ ("v", "toggle eventlog"),
+ ("X", "kill and delete connection, even if it's mid-intercept"),
+ ("tab", "tab between eventlog and connection list"),
+ ("enter", "view connection"),
+ ]
+ text.extend(common.format_keyvals(keys, key="key", val="text", indent=4))
+
+ text.append(("head", "\n\nConnection view keys:\n"))
+ keys = [
+ ("b", "save request/response body"),
+ ("e", "edit request/response"),
+ ("p", "previous flow"),
+ ("v", "view body in external viewer"),
+ ("z", "encode/decode a request/response"),
+ ("tab", "toggle request/response view"),
+ ("space", "next flow"),
+ ]
+ text.extend(common.format_keyvals(keys, key="key", val="text", indent=4))
+
+ text.append(("head", "\n\nFilter expressions:\n"))
+ f = []
+ for i in filt.filt_unary:
+ f.append(
+ ("~%s"%i.code, i.help)
+ )
+ for i in filt.filt_rex:
+ f.append(
+ ("~%s regex"%i.code, i.help)
+ )
+ for i in filt.filt_int:
+ f.append(
+ ("~%s int"%i.code, i.help)
+ )
+ f.sort()
+ f.extend(
+ [
+ ("!", "unary not"),
+ ("&", "and"),
+ ("|", "or"),
+ ("(...)", "grouping"),
+ ]
+ )
+ text.extend(common.format_keyvals(f, key="key", val="text", indent=4))
+
+ text.extend(
+ [
+ "\n",
+ ("text", " Regexes are Python-style.\n"),
+ ("text", " Regexes can be specified as quoted strings.\n"),
+ ("text", " Header matching (~h, ~hq, ~hs) is against a string of the form \"name: value\".\n"),
+ ("text", " Expressions with no operators are regex matches against URL.\n"),
+ ("text", " Default binary operator is &.\n"),
+ ("head", "\n Examples:\n"),
+ ]
+ )
+ examples = [
+ ("google\.com", "Url containing \"google.com"),
+ ("~q ~b test", "Requests where body contains \"test\""),
+ ("!(~q & ~t \"text/html\")", "Anything but requests with a text/html content type."),
+ ]
+ text.extend(common.format_keyvals(examples, key="key", val="text", indent=4))
+ return [urwid.Text(text)]
+