aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmproxy/console/common.py83
-rw-r--r--libmproxy/console/flowlist.py1
-rw-r--r--libmproxy/console/flowview.py2
3 files changed, 59 insertions, 27 deletions
diff --git a/libmproxy/console/common.py b/libmproxy/console/common.py
index 03880522..8c6f195d 100644
--- a/libmproxy/console/common.py
+++ b/libmproxy/console/common.py
@@ -106,34 +106,36 @@ else:
SYMBOL_RETURN = u"<-"
-def format_flow(f, focus, extended=False, padding=2):
- pile = []
+def raw_format_flow(f, focus, extended, padding):
+ f = dict(f)
+
+ pile = []
req = []
if extended:
req.append(
fcol(
- utils.format_timestamp(f.request.timestamp),
+ utils.format_timestamp(f["req_timestamp"]),
"highlight"
)
)
else:
req.append(fcol(">>" if focus else " ", "focus"))
- if f.request.is_replay():
+ if f["req_is_replay"]:
req.append(fcol(SYMBOL_REPLAY, "replay"))
- req.append(fcol(f.request.method, "method"))
+ req.append(fcol(f["req_method"], "method"))
preamble = sum(i[1] for i in req) + len(req) -1
- if f.intercepting and not f.request.acked:
+ if f["intercepting"] and not f["req_acked"]:
uc = "intercept"
- elif f.response or f.error:
+ elif f["resp_code"] or f["err_msg"]:
uc = "text"
else:
uc = "title"
req.append(
- urwid.Text([(uc, f.request.get_url())])
+ urwid.Text([(uc, f["req_url"])])
)
pile.append(urwid.Columns(req, dividechars=1))
@@ -143,38 +145,33 @@ def format_flow(f, focus, extended=False, padding=2):
("fixed", preamble, urwid.Text(""))
)
- if f.response:
- if f.response.code in [200, 304]:
+ if f["resp_code"]:
+ if f["resp_code"] in [200, 304]:
resp.append(fcol(SYMBOL_RETURN, "goodcode"))
else:
resp.append(fcol(SYMBOL_RETURN, "error"))
- if f.response.is_replay():
+ if f["resp_is_replay"]:
resp.append(fcol(SYMBOL_REPLAY, "replay"))
- if f.response.code in [200, 304]:
- resp.append(fcol(f.response.code, "goodcode"))
+ if f["resp_code"] in [200, 304]:
+ resp.append(fcol(f["resp_code"], "goodcode"))
else:
- resp.append(fcol(f.response.code, "error"))
+ resp.append(fcol(f["resp_code"], "error"))
- if f.intercepting and f.response and not f.response.acked:
+ if f["intercepting"] and f["resp_code"] and not f["resp_acked"]:
rc = "intercept"
else:
rc = "text"
- t = f.response.headers["content-type"]
- if t:
- t = t[0].split(";")[0]
- resp.append(fcol(t, rc))
- if f.response.content:
- resp.append(fcol(utils.pretty_size(len(f.response.content)), rc))
- else:
- resp.append(fcol("[empty content]", rc))
- elif f.error:
+ if f["resp_ctype"]:
+ resp.append(fcol(f["resp_ctype"], rc))
+ resp.append(fcol(f["resp_clen"], rc))
+ elif f["err_msg"]:
resp.append(fcol(SYMBOL_RETURN, "error"))
resp.append(
urwid.Text([
(
"error",
- f.error.msg
+ f["err_msg"]
)
])
)
@@ -182,6 +179,42 @@ def format_flow(f, focus, extended=False, padding=2):
return urwid.Pile(pile)
+class FlowCache:
+ @utils.LRUCache(200)
+ def format_flow(self, *args):
+ return raw_format_flow(*args)
+flowcache = FlowCache()
+
+
+def format_flow(f, focus, extended=False, padding=2):
+ d = dict(
+ intercepting = f.intercepting,
+
+ req_timestamp = f.request.timestamp,
+ req_is_replay = f.request.is_replay(),
+ req_method = f.request.method,
+ req_acked = f.request.acked,
+ req_url = f.request.get_url(),
+
+ err_msg = f.error.msg if f.error else None,
+ resp_code = f.response.code if f.response else None,
+ )
+ if f.response:
+ d.update(dict(
+ resp_code = f.response.code,
+ resp_is_replay = f.response.is_replay(),
+ resp_acked = f.response.acked,
+ resp_clen = utils.pretty_size(len(f.response.content)) if f.response.content else "[empty content]"
+ ))
+ t = f.response.headers["content-type"]
+ if t:
+ d["resp_ctype"] = t[0].split(";")[0]
+ else:
+ d["resp_ctype"] = ""
+ return flowcache.format_flow(tuple(sorted(d.items())), focus, extended, padding)
+
+
+
def int_version(v):
SIG = 3
v = urwid.__version__.split("-")[0].split(".")
diff --git a/libmproxy/console/flowlist.py b/libmproxy/console/flowlist.py
index c7673ca2..a4784fa4 100644
--- a/libmproxy/console/flowlist.py
+++ b/libmproxy/console/flowlist.py
@@ -171,7 +171,6 @@ class ConnectionListView(urwid.ListWalker):
def set_focus(self, focus):
ret = self.state.set_focus(focus)
- self._modified()
return ret
def get_next(self, pos):
diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py
index c4a12308..6a0e1b08 100644
--- a/libmproxy/console/flowview.py
+++ b/libmproxy/console/flowview.py
@@ -421,7 +421,7 @@ class ConnectionView(common.WWrap):
("yes", "y"),
("no", "n"),
],
- self.edit_form_confirm,
+ self.edit_form_confirm,
conn
)
else: