mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-23 08:11:00 +00:00
f25156a637
We now use proper Columns, rather than laying it out manually.
149 lines
3.8 KiB
Python
149 lines
3.8 KiB
Python
import urwid
|
|
from .. import utils
|
|
|
|
|
|
VIEW_BODY_RAW = 0
|
|
VIEW_BODY_HEX = 1
|
|
VIEW_BODY_PRETTY = 2
|
|
|
|
BODY_VIEWS = {
|
|
VIEW_BODY_RAW: "raw",
|
|
VIEW_BODY_HEX: "hex",
|
|
VIEW_BODY_PRETTY: "pretty"
|
|
}
|
|
|
|
VIEW_FLOW_REQUEST = 0
|
|
VIEW_FLOW_RESPONSE = 1
|
|
|
|
|
|
def highlight_key(s, k):
|
|
l = []
|
|
parts = s.split(k, 1)
|
|
if parts[0]:
|
|
l.append(("text", parts[0]))
|
|
l.append(("key", k))
|
|
if parts[1]:
|
|
l.append(("text", parts[1]))
|
|
return l
|
|
|
|
|
|
KEY_MAX = 30
|
|
def format_keyvals(lst, key="key", val="text", indent=0):
|
|
"""
|
|
Format a list of (key, value) tuples.
|
|
|
|
If key is None, it's treated specially:
|
|
- We assume a sub-value, and add an extra indent.
|
|
- The value is treated as a pre-formatted list of directives.
|
|
"""
|
|
ret = []
|
|
if lst:
|
|
maxk = min(max(len(i[0]) for i in lst if i and i[0]), KEY_MAX)
|
|
for i, kv in enumerate(lst):
|
|
if kv is None:
|
|
ret.append(Text(""))
|
|
else:
|
|
ret.append(
|
|
urwid.Columns(
|
|
[
|
|
("fixed", indent, urwid.Text("")),
|
|
(
|
|
"fixed",
|
|
maxk,
|
|
urwid.Text([(key, kv[0] or "")])
|
|
),
|
|
urwid.Text([(val, kv[1])])
|
|
],
|
|
dividechars = 2
|
|
)
|
|
)
|
|
return ret
|
|
|
|
|
|
def shortcuts(k):
|
|
if k == " ":
|
|
k = "page down"
|
|
elif k == "j":
|
|
k = "down"
|
|
elif k == "k":
|
|
k = "up"
|
|
return k
|
|
|
|
|
|
def format_flow(f, focus, extended=False, padding=2):
|
|
txt = []
|
|
if extended:
|
|
txt.append(("highlight", utils.format_timestamp(f.request.timestamp)))
|
|
txt.append(" ")
|
|
if f.request.is_replay():
|
|
txt.append(("method", "[replay]"))
|
|
txt.extend([
|
|
("ack", "!") if f.intercepting and not f.request.acked else " ",
|
|
("method", f.request.method),
|
|
" ",
|
|
(
|
|
"text" if (f.response or f.error) else "title",
|
|
f.request.get_url(),
|
|
),
|
|
])
|
|
if f.response or f.error or f.request.is_replay():
|
|
tsr = f.response or f.error
|
|
if extended and tsr:
|
|
ts = ("highlight", utils.format_timestamp(tsr.timestamp) + " ")
|
|
else:
|
|
ts = " "
|
|
|
|
txt.append("\n")
|
|
txt.append(("text", ts))
|
|
txt.append(" "*(padding+2))
|
|
|
|
if f.response:
|
|
txt.append(
|
|
("ack", "!") if f.intercepting and not f.response.acked else " "
|
|
)
|
|
txt.append("<- ")
|
|
if f.response.is_replay():
|
|
txt.append(("method", "[replay] "))
|
|
if f.response.code in [200, 304]:
|
|
txt.append(("goodcode", str(f.response.code)))
|
|
else:
|
|
txt.append(("error", str(f.response.code)))
|
|
t = f.response.headers["content-type"]
|
|
if t:
|
|
t = t[0].split(";")[0]
|
|
txt.append(("text", " %s"%t))
|
|
if f.response.content:
|
|
txt.append(", %s"%utils.pretty_size(len(f.response.content)))
|
|
elif f.error:
|
|
txt.append(
|
|
("error", f.error.msg)
|
|
)
|
|
|
|
if focus:
|
|
txt.insert(0, ("focus", ">>" + " "*(padding-2)))
|
|
else:
|
|
txt.insert(0, " "*padding)
|
|
return txt
|
|
|
|
|
|
def int_version(v):
|
|
SIG = 3
|
|
v = urwid.__version__.split("-")[0].split(".")
|
|
x = 0
|
|
for i in range(min(SIG, len(v))):
|
|
x += int(v[i]) * 10**(SIG-i)
|
|
return x
|
|
|
|
|
|
# We have to do this to be portable over 0.9.8 and 0.9.9 If compatibility
|
|
# becomes a pain to maintain, we'll just mandate 0.9.9 or newer.
|
|
class WWrap(urwid.WidgetWrap):
|
|
if int_version(urwid.__version__) >= 990:
|
|
def set_w(self, x):
|
|
self._w = x
|
|
def get_w(self):
|
|
return self._w
|
|
w = property(get_w, set_w)
|
|
|
|
|