mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-23 08:11:00 +00:00
Merge pull request #2384 from cortesi/layouts
console: layout pane headers
This commit is contained in:
commit
75c047da3f
@ -385,6 +385,10 @@ class Options(optmanager.OptManager):
|
|||||||
"Console layout.",
|
"Console layout.",
|
||||||
choices=sorted(console_layouts),
|
choices=sorted(console_layouts),
|
||||||
)
|
)
|
||||||
|
self.add_option(
|
||||||
|
"console_layout_headers", bool, True,
|
||||||
|
"Show layout comonent headers",
|
||||||
|
)
|
||||||
self.add_option(
|
self.add_option(
|
||||||
"console_focus_follow", bool, False,
|
"console_focus_follow", bool, False,
|
||||||
"Focus follows new flows."
|
"Focus follows new flows."
|
||||||
|
@ -109,6 +109,7 @@ def mitmproxy(opts):
|
|||||||
common_options(parser, opts)
|
common_options(parser, opts)
|
||||||
|
|
||||||
opts.make_parser(parser, "console_layout")
|
opts.make_parser(parser, "console_layout")
|
||||||
|
opts.make_parser(parser, "console_layout_headers")
|
||||||
group = parser.add_argument_group(
|
group = parser.add_argument_group(
|
||||||
"Filters",
|
"Filters",
|
||||||
"See help in mitmproxy for filter expression syntax."
|
"See help in mitmproxy for filter expression syntax."
|
||||||
|
@ -152,6 +152,7 @@ class CommandHelp(urwid.Frame):
|
|||||||
|
|
||||||
|
|
||||||
class Commands(urwid.Pile):
|
class Commands(urwid.Pile):
|
||||||
|
title = "Commands"
|
||||||
keyctx = "commands"
|
keyctx = "commands"
|
||||||
|
|
||||||
def __init__(self, master):
|
def __init__(self, master):
|
||||||
|
@ -10,6 +10,7 @@ class LogBufferWalker(urwid.SimpleListWalker):
|
|||||||
|
|
||||||
class EventLog(urwid.ListBox):
|
class EventLog(urwid.ListBox):
|
||||||
keyctx = "eventlog"
|
keyctx = "eventlog"
|
||||||
|
title = "Events"
|
||||||
|
|
||||||
def __init__(self, master):
|
def __init__(self, master):
|
||||||
self.walker = LogBufferWalker([])
|
self.walker = LogBufferWalker([])
|
||||||
|
@ -110,6 +110,7 @@ class FlowListWalker(urwid.ListWalker):
|
|||||||
|
|
||||||
|
|
||||||
class FlowListBox(urwid.ListBox):
|
class FlowListBox(urwid.ListBox):
|
||||||
|
title = "Flows"
|
||||||
keyctx = "flowlist"
|
keyctx = "flowlist"
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
|
@ -276,6 +276,7 @@ class FlowDetails(tabs.Tabs):
|
|||||||
|
|
||||||
class FlowView(urwid.Frame):
|
class FlowView(urwid.Frame):
|
||||||
keyctx = "flowview"
|
keyctx = "flowview"
|
||||||
|
title = "Flow Details"
|
||||||
|
|
||||||
def __init__(self, master):
|
def __init__(self, master):
|
||||||
super().__init__(
|
super().__init__(
|
||||||
|
@ -16,7 +16,7 @@ from mitmproxy.net.http import Headers
|
|||||||
|
|
||||||
|
|
||||||
class QueryEditor(base.FocusEditor):
|
class QueryEditor(base.FocusEditor):
|
||||||
title = "Editing query"
|
title = "Edit Query"
|
||||||
columns = [
|
columns = [
|
||||||
col_text.Column("Key"),
|
col_text.Column("Key"),
|
||||||
col_text.Column("Value")
|
col_text.Column("Value")
|
||||||
@ -71,7 +71,7 @@ class HeaderEditor(base.FocusEditor):
|
|||||||
|
|
||||||
|
|
||||||
class RequestHeaderEditor(HeaderEditor):
|
class RequestHeaderEditor(HeaderEditor):
|
||||||
title = "Editing request headers"
|
title = "Edit Request Headers"
|
||||||
|
|
||||||
def get_data(self, flow):
|
def get_data(self, flow):
|
||||||
return flow.request.headers.fields
|
return flow.request.headers.fields
|
||||||
@ -81,7 +81,7 @@ class RequestHeaderEditor(HeaderEditor):
|
|||||||
|
|
||||||
|
|
||||||
class ResponseHeaderEditor(HeaderEditor):
|
class ResponseHeaderEditor(HeaderEditor):
|
||||||
title = "Editing response headers"
|
title = "Edit Response Headers"
|
||||||
|
|
||||||
def get_data(self, flow):
|
def get_data(self, flow):
|
||||||
return flow.response.headers.fields
|
return flow.response.headers.fields
|
||||||
@ -91,7 +91,7 @@ class ResponseHeaderEditor(HeaderEditor):
|
|||||||
|
|
||||||
|
|
||||||
class RequestFormEditor(base.FocusEditor):
|
class RequestFormEditor(base.FocusEditor):
|
||||||
title = "Editing URL-encoded form"
|
title = "Edit URL-encoded Form"
|
||||||
columns = [
|
columns = [
|
||||||
col_text.Column("Key"),
|
col_text.Column("Key"),
|
||||||
col_text.Column("Value")
|
col_text.Column("Value")
|
||||||
@ -157,7 +157,7 @@ class SetHeadersEditor(base.GridEditor):
|
|||||||
class PathEditor(base.FocusEditor):
|
class PathEditor(base.FocusEditor):
|
||||||
# TODO: Next row on enter?
|
# TODO: Next row on enter?
|
||||||
|
|
||||||
title = "Editing URL path components"
|
title = "Edit Path Components"
|
||||||
columns = [
|
columns = [
|
||||||
col_text.Column("Component"),
|
col_text.Column("Component"),
|
||||||
]
|
]
|
||||||
@ -208,7 +208,7 @@ class HostPatternEditor(base.GridEditor):
|
|||||||
|
|
||||||
|
|
||||||
class CookieEditor(base.FocusEditor):
|
class CookieEditor(base.FocusEditor):
|
||||||
title = "Editing request Cookie header"
|
title = "Edit Cookies"
|
||||||
columns = [
|
columns = [
|
||||||
col_text.Column("Name"),
|
col_text.Column("Name"),
|
||||||
col_text.Column("Value"),
|
col_text.Column("Value"),
|
||||||
@ -242,7 +242,7 @@ class CookieAttributeEditor(base.GridEditor):
|
|||||||
|
|
||||||
|
|
||||||
class SetCookieEditor(base.FocusEditor):
|
class SetCookieEditor(base.FocusEditor):
|
||||||
title = "Editing response SetCookie header"
|
title = "Edit SetCookie Header"
|
||||||
columns = [
|
columns = [
|
||||||
col_text.Column("Name"),
|
col_text.Column("Name"),
|
||||||
col_text.Column("Value"),
|
col_text.Column("Value"),
|
||||||
|
@ -14,6 +14,7 @@ footer = [
|
|||||||
|
|
||||||
|
|
||||||
class HelpView(urwid.ListBox):
|
class HelpView(urwid.ListBox):
|
||||||
|
title = "Help"
|
||||||
keyctx = "help"
|
keyctx = "help"
|
||||||
|
|
||||||
def __init__(self, help_context):
|
def __init__(self, help_context):
|
||||||
|
@ -264,6 +264,7 @@ class OptionHelp(urwid.Frame):
|
|||||||
|
|
||||||
|
|
||||||
class Options(urwid.Pile):
|
class Options(urwid.Pile):
|
||||||
|
title = "Options"
|
||||||
keyctx = "options"
|
keyctx = "options"
|
||||||
|
|
||||||
def __init__(self, master):
|
def __init__(self, master):
|
||||||
|
@ -11,6 +11,17 @@ from mitmproxy.tools.console import grideditor
|
|||||||
from mitmproxy.tools.console import eventlog
|
from mitmproxy.tools.console import eventlog
|
||||||
|
|
||||||
|
|
||||||
|
class Header(urwid.Frame):
|
||||||
|
def __init__(self, widget, title, focus):
|
||||||
|
super().__init__(
|
||||||
|
widget,
|
||||||
|
header = urwid.AttrWrap(
|
||||||
|
urwid.Text(title),
|
||||||
|
"heading" if focus else "heading_inactive"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class WindowStack:
|
class WindowStack:
|
||||||
def __init__(self, master, base):
|
def __init__(self, master, base):
|
||||||
self.master = master
|
self.master = master
|
||||||
@ -90,6 +101,7 @@ class Window(urwid.Frame):
|
|||||||
signals.push_view_state.connect(self.push)
|
signals.push_view_state.connect(self.push)
|
||||||
|
|
||||||
self.master.options.subscribe(self.configure, ["console_layout"])
|
self.master.options.subscribe(self.configure, ["console_layout"])
|
||||||
|
self.master.options.subscribe(self.configure, ["console_layout_headers"])
|
||||||
self.pane = 0
|
self.pane = 0
|
||||||
self.stacks = [
|
self.stacks = [
|
||||||
WindowStack(master, "flowlist"),
|
WindowStack(master, "flowlist"),
|
||||||
@ -107,21 +119,31 @@ class Window(urwid.Frame):
|
|||||||
Redraw the layout.
|
Redraw the layout.
|
||||||
"""
|
"""
|
||||||
c = self.master.options.console_layout
|
c = self.master.options.console_layout
|
||||||
|
if c == "single":
|
||||||
|
self.pane = 0
|
||||||
|
|
||||||
|
def wrap(w, idx):
|
||||||
|
if self.master.options.console_layout_headers and hasattr(w, "title"):
|
||||||
|
return Header(w, w.title, self.pane == idx)
|
||||||
|
else:
|
||||||
|
return w
|
||||||
|
|
||||||
w = None
|
w = None
|
||||||
if c == "single":
|
if c == "single":
|
||||||
w = self.stacks[0].top()
|
w = wrap(self.stacks[0].top(), 0)
|
||||||
elif c == "vertical":
|
elif c == "vertical":
|
||||||
w = urwid.Pile(
|
w = urwid.Pile(
|
||||||
[i.top() for i in self.stacks]
|
[
|
||||||
|
wrap(s.top(), i) for i, s in enumerate(self.stacks)
|
||||||
|
]
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
w = urwid.Columns(
|
w = urwid.Columns(
|
||||||
[i.top() for i in self.stacks], dividechars=1
|
[wrap(s.top(), i) for i, s in enumerate(self.stacks)],
|
||||||
|
dividechars=1
|
||||||
)
|
)
|
||||||
|
|
||||||
self.body = urwid.AttrWrap(w, "background")
|
self.body = urwid.AttrWrap(w, "background")
|
||||||
if c == "single":
|
|
||||||
self.pane = 0
|
|
||||||
|
|
||||||
def flow_changed(self, sender, flow):
|
def flow_changed(self, sender, flow):
|
||||||
if self.master.view.focus.flow:
|
if self.master.view.focus.flow:
|
||||||
@ -200,6 +222,7 @@ class Window(urwid.Frame):
|
|||||||
self.pane = 0
|
self.pane = 0
|
||||||
else:
|
else:
|
||||||
self.pane = (self.pane + 1) % len(self.stacks)
|
self.pane = (self.pane + 1) % len(self.stacks)
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
def mouse_event(self, *args, **kwargs):
|
def mouse_event(self, *args, **kwargs):
|
||||||
# args: (size, event, button, col, row)
|
# args: (size, event, button, col, row)
|
||||||
|
Loading…
Reference in New Issue
Block a user