mirror of
https://github.com/zhigang1992/mitmproxy.git
synced 2026-01-12 17:32:27 +08:00
console: Make EventLog its own control, bind to "E"
This commit is contained in:
47
mitmproxy/tools/console/eventlog.py
Normal file
47
mitmproxy/tools/console/eventlog.py
Normal file
@@ -0,0 +1,47 @@
|
||||
import urwid
|
||||
from mitmproxy.tools.console import signals
|
||||
|
||||
EVENTLOG_SIZE = 10000
|
||||
|
||||
|
||||
class LogBufferWalker(urwid.SimpleListWalker):
|
||||
pass
|
||||
|
||||
|
||||
class EventLog(urwid.ListBox):
|
||||
keyctx = "eventlog"
|
||||
|
||||
def __init__(self, master):
|
||||
self.walker = LogBufferWalker([])
|
||||
self.master = master
|
||||
urwid.ListBox.__init__(self, self.walker)
|
||||
signals.sig_add_log.connect(self.sig_add_log)
|
||||
|
||||
def set_focus(self, index):
|
||||
if 0 <= index < len(self.walker):
|
||||
super().set_focus(index)
|
||||
|
||||
def keypress(self, size, key):
|
||||
if key == "z":
|
||||
self.master.clear_events()
|
||||
key = None
|
||||
elif key == "m_end":
|
||||
self.set_focus(len(self.walker) - 1)
|
||||
elif key == "m_start":
|
||||
self.set_focus(0)
|
||||
return urwid.ListBox.keypress(self, size, key)
|
||||
|
||||
def sig_add_log(self, sender, e, level):
|
||||
txt = "%s: %s" % (level, str(e))
|
||||
if level in ("error", "warn"):
|
||||
e = urwid.Text((level, txt))
|
||||
else:
|
||||
e = urwid.Text(txt)
|
||||
self.walker.append(e)
|
||||
if len(self.walker) > EVENTLOG_SIZE:
|
||||
self.walker.pop(0)
|
||||
if self.master.options.console_focus_follow:
|
||||
self.walker.set_focus(len(self.walker) - 1)
|
||||
|
||||
def clear_events(self):
|
||||
self.walker[:] = []
|
||||
@@ -47,68 +47,6 @@ footer = [
|
||||
]
|
||||
|
||||
|
||||
class LogBufferBox(urwid.ListBox):
|
||||
|
||||
def __init__(self, master):
|
||||
self.master = master
|
||||
urwid.ListBox.__init__(self, master.logbuffer)
|
||||
|
||||
def set_focus(self, index):
|
||||
if 0 <= index < len(self.master.logbuffer):
|
||||
super().set_focus(index)
|
||||
|
||||
def keypress(self, size, key):
|
||||
if key == "z":
|
||||
self.master.clear_events()
|
||||
key = None
|
||||
elif key == "m_end":
|
||||
self.set_focus(len(self.master.logbuffer) - 1)
|
||||
elif key == "m_start":
|
||||
self.set_focus(0)
|
||||
return urwid.ListBox.keypress(self, size, key)
|
||||
|
||||
|
||||
class BodyPile(urwid.Pile):
|
||||
|
||||
def __init__(self, master):
|
||||
h = urwid.Text("Event log")
|
||||
h = urwid.Padding(h, align="left", width=("relative", 100))
|
||||
|
||||
self.inactive_header = urwid.AttrWrap(h, "heading_inactive")
|
||||
self.active_header = urwid.AttrWrap(h, "heading")
|
||||
|
||||
urwid.Pile.__init__(
|
||||
self,
|
||||
[
|
||||
FlowListBox(master),
|
||||
urwid.Frame(
|
||||
LogBufferBox(master),
|
||||
header = self.inactive_header
|
||||
)
|
||||
]
|
||||
)
|
||||
self.master = master
|
||||
|
||||
def keypress(self, size, key):
|
||||
if key == "tab":
|
||||
self.focus_position = (
|
||||
self.focus_position + 1) % len(self.widget_list)
|
||||
if self.focus_position == 1:
|
||||
self.widget_list[1].header = self.active_header
|
||||
else:
|
||||
self.widget_list[1].header = self.inactive_header
|
||||
key = None
|
||||
|
||||
# This is essentially a copypasta from urwid.Pile's keypress handler.
|
||||
# So much for "closed for modification, but open for extension".
|
||||
item_rows = None
|
||||
if len(size) == 2:
|
||||
item_rows = self.get_item_rows(size, focus = True)
|
||||
i = self.widget_list.index(self.focus_item)
|
||||
tsize = self.get_item_size(size, i, True, item_rows)
|
||||
return self.focus_item.keypress(tsize, key)
|
||||
|
||||
|
||||
class FlowItem(urwid.WidgetWrap):
|
||||
|
||||
def __init__(self, master, flow):
|
||||
|
||||
@@ -31,8 +31,6 @@ from mitmproxy.tools.console import window
|
||||
from mitmproxy import contentviews
|
||||
from mitmproxy.utils import strutils
|
||||
|
||||
EVENTLOG_SIZE = 10000
|
||||
|
||||
|
||||
class Logger:
|
||||
def log(self, evt):
|
||||
@@ -166,8 +164,9 @@ class ConsoleAddon:
|
||||
except exceptions.CommandError as e:
|
||||
signals.status_message.send(message=str(e))
|
||||
|
||||
self.master.overlay(overlay.Chooser(self.master, prompt, choices, "", callback))
|
||||
ctx.log.info(choices)
|
||||
self.master.overlay(
|
||||
overlay.Chooser(self.master, prompt, choices, "", callback)
|
||||
)
|
||||
|
||||
@command.command("console.choose.cmd")
|
||||
def console_choose_cmd(
|
||||
@@ -189,8 +188,9 @@ class ConsoleAddon:
|
||||
except exceptions.CommandError as e:
|
||||
signals.status_message.send(message=str(e))
|
||||
|
||||
self.master.overlay(overlay.Chooser(self.master, prompt, choices, "", callback))
|
||||
ctx.log.info(choices)
|
||||
self.master.overlay(
|
||||
overlay.Chooser(self.master, prompt, choices, "", callback)
|
||||
)
|
||||
|
||||
@command.command("console.command")
|
||||
def console_command(self, *partial: typing.Sequence[str]) -> None:
|
||||
@@ -209,6 +209,11 @@ class ConsoleAddon:
|
||||
"""View the options editor."""
|
||||
self.master.switch_view("options")
|
||||
|
||||
@command.command("console.view.eventlog")
|
||||
def view_eventlog(self) -> None:
|
||||
"""View the options editor."""
|
||||
self.master.switch_view("eventlog")
|
||||
|
||||
@command.command("console.view.help")
|
||||
def view_help(self) -> None:
|
||||
"""View help."""
|
||||
@@ -351,6 +356,7 @@ def default_keymap(km):
|
||||
km.add("?", "console.view.help", ["global"])
|
||||
km.add("C", "console.view.commands", ["global"])
|
||||
km.add("O", "console.view.options", ["global"])
|
||||
km.add("E", "console.view.eventlog", ["global"])
|
||||
km.add("Q", "console.exit", ["global"])
|
||||
km.add("q", "console.view.pop", ["global"])
|
||||
|
||||
@@ -375,9 +381,8 @@ def default_keymap(km):
|
||||
)
|
||||
km.add("d", "view.remove @focus", ["flowlist", "flowview"])
|
||||
km.add("D", "view.duplicate @focus", ["flowlist", "flowview"])
|
||||
km.add("e", "set console_eventlog=toggle", ["flowlist"])
|
||||
km.add(
|
||||
"E",
|
||||
"e",
|
||||
"console.choose.cmd Format export.formats "
|
||||
"console.command export.file {choice} @focus ''",
|
||||
["flowlist", "flowview"]
|
||||
@@ -461,8 +466,6 @@ class ConsoleMaster(master.Master):
|
||||
default_keymap(self.keymap)
|
||||
self.options.errored.connect(self.options_error)
|
||||
|
||||
self.logbuffer = urwid.SimpleListWalker([])
|
||||
|
||||
self.view_stack = []
|
||||
|
||||
signals.call_in.connect(self.sig_call_in)
|
||||
@@ -508,19 +511,10 @@ class ConsoleMaster(master.Master):
|
||||
def sig_add_log(self, sender, e, level):
|
||||
if self.options.verbosity < log.log_tier(level):
|
||||
return
|
||||
|
||||
if level in ("error", "warn"):
|
||||
signals.status_message.send(
|
||||
message = "{}: {}".format(level.title(), e)
|
||||
)
|
||||
e = urwid.Text((level, str(e)))
|
||||
else:
|
||||
e = urwid.Text(str(e))
|
||||
self.logbuffer.append(e)
|
||||
if len(self.logbuffer) > EVENTLOG_SIZE:
|
||||
self.logbuffer.pop(0)
|
||||
if self.options.console_focus_follow:
|
||||
self.logbuffer.set_focus(len(self.logbuffer) - 1)
|
||||
|
||||
def sig_call_in(self, sender, seconds, callback, args=()):
|
||||
def cb(*_):
|
||||
@@ -621,12 +615,9 @@ class ConsoleMaster(master.Master):
|
||||
|
||||
self.window = window.Window(self)
|
||||
self.loop.widget = self.window
|
||||
self.window.refresh()
|
||||
|
||||
self.loop.set_alarm_in(0.01, self.ticker)
|
||||
self.loop.set_alarm_in(
|
||||
0.0001,
|
||||
lambda *args: self.switch_view("flowlist")
|
||||
)
|
||||
|
||||
self.start()
|
||||
try:
|
||||
@@ -660,6 +651,3 @@ class ConsoleMaster(master.Master):
|
||||
def quit(self, a):
|
||||
if a != "n":
|
||||
self.shutdown()
|
||||
|
||||
def clear_events(self):
|
||||
self.logbuffer[:] = []
|
||||
|
||||
@@ -34,8 +34,8 @@ class PromptStub:
|
||||
class ActionBar(urwid.WidgetWrap):
|
||||
|
||||
def __init__(self, master):
|
||||
urwid.WidgetWrap.__init__(self, None)
|
||||
self.master = master
|
||||
urwid.WidgetWrap.__init__(self, None)
|
||||
self.clear()
|
||||
signals.status_message.connect(self.sig_message)
|
||||
signals.status_prompt.connect(self.sig_prompt)
|
||||
@@ -151,7 +151,7 @@ class StatusBar(urwid.WidgetWrap):
|
||||
self.master = master
|
||||
self.helptext = helptext
|
||||
self.ib = urwid.WidgetWrap(urwid.Text(""))
|
||||
self.ab = ActionBar(self)
|
||||
self.ab = ActionBar(self.master)
|
||||
super().__init__(urwid.Pile([self.ib, self.ab]))
|
||||
signals.update_settings.connect(self.sig_update)
|
||||
signals.flowlist_change.connect(self.sig_update)
|
||||
|
||||
@@ -8,6 +8,7 @@ from mitmproxy.tools.console import options
|
||||
from mitmproxy.tools.console import overlay
|
||||
from mitmproxy.tools.console import help
|
||||
from mitmproxy.tools.console import grideditor
|
||||
from mitmproxy.tools.console import eventlog
|
||||
|
||||
|
||||
class Window(urwid.Frame):
|
||||
@@ -19,7 +20,6 @@ class Window(urwid.Frame):
|
||||
footer = urwid.AttrWrap(self.statusbar, "background")
|
||||
)
|
||||
self.master = master
|
||||
self.primary_stack = []
|
||||
self.master.view.sig_view_refresh.connect(self.view_changed)
|
||||
self.master.view.sig_view_add.connect(self.view_changed)
|
||||
self.master.view.sig_view_remove.connect(self.view_changed)
|
||||
@@ -38,13 +38,23 @@ class Window(urwid.Frame):
|
||||
commands = commands.Commands(self.master),
|
||||
options = options.Options(self.master),
|
||||
help = help.HelpView(None),
|
||||
eventlog = eventlog.EventLog(self.master),
|
||||
|
||||
edit_focus_query = grideditor.QueryEditor(self.master),
|
||||
edit_focus_cookies = grideditor.CookieEditor(self.master),
|
||||
edit_focus_setcookies = grideditor.SetCookieEditor(self.master),
|
||||
edit_focus_form = grideditor.RequestFormEditor(self.master),
|
||||
edit_focus_path = grideditor.PathEditor(self.master),
|
||||
edit_focus_request_headers = grideditor.RequestHeaderEditor(self.master),
|
||||
edit_focus_response_headers = grideditor.ResponseHeaderEditor(self.master),
|
||||
edit_focus_response_headers = grideditor.ResponseHeaderEditor(
|
||||
self.master
|
||||
),
|
||||
)
|
||||
self.primary_stack = ["flowlist"]
|
||||
|
||||
def refresh(self):
|
||||
self.body = urwid.AttrWrap(
|
||||
self.windows[self.primary_stack[-1]], "background"
|
||||
)
|
||||
|
||||
def call(self, v, name, *args, **kwargs):
|
||||
@@ -80,9 +90,7 @@ class Window(urwid.Frame):
|
||||
if self.primary_stack and self.primary_stack[-1] == wname:
|
||||
return
|
||||
self.primary_stack.append(wname)
|
||||
self.body = urwid.AttrWrap(
|
||||
self.windows[wname], "background"
|
||||
)
|
||||
self.refresh()
|
||||
self.view_changed()
|
||||
self.focus_changed()
|
||||
|
||||
@@ -93,10 +101,7 @@ class Window(urwid.Frame):
|
||||
if len(self.primary_stack) > 1:
|
||||
self.view_popping()
|
||||
self.primary_stack.pop()
|
||||
self.body = urwid.AttrWrap(
|
||||
self.windows[self.primary_stack[-1]],
|
||||
"background",
|
||||
)
|
||||
self.refresh()
|
||||
self.view_changed()
|
||||
self.focus_changed()
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user