mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-23 08:11:00 +00:00
866a93a8bc
I want each view to have a more coherent set of bindings. This means minimizing the global bindings, and making some bindings accessible only from screens related to their functionality.
114 lines
3.9 KiB
Python
114 lines
3.9 KiB
Python
import urwid
|
|
import common
|
|
from .. import filt
|
|
|
|
class HelpView(urwid.ListBox):
|
|
def __init__(self, master, help_context, state):
|
|
self.master, self.state = master, state
|
|
self.help_context = help_context or []
|
|
urwid.ListBox.__init__(
|
|
self,
|
|
self.helptext()
|
|
)
|
|
|
|
def keypress(self, size, key):
|
|
key = common.shortcuts(key)
|
|
if key == "q":
|
|
self.master.statusbar = self.state[0]
|
|
self.master.body = self.state[1]
|
|
self.master.header = self.state[2]
|
|
self.master.make_view()
|
|
return None
|
|
return urwid.ListBox.keypress(self, size, key)
|
|
|
|
def helptext(self):
|
|
text = []
|
|
text.append(("head", "Keys for this view:\n"))
|
|
text.extend(self.help_context)
|
|
|
|
text.append(("head", "\n\nGlobal keys:\n"))
|
|
keys = [
|
|
("c", "client replay"),
|
|
("i", "set interception pattern"),
|
|
("j, k", "up, down"),
|
|
("l", "set limit filter pattern"),
|
|
("L", "load saved flows"),
|
|
|
|
("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"),
|
|
("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\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)]
|
|
|