aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2012-02-18 11:11:59 +1300
committerAldo Cortesi <aldo@nullcube.com>2012-02-18 11:11:59 +1300
commit08fdd23e234ffaa11352891b103377240bc11fbe (patch)
tree2a3756af7b984ec1fb7a2414a19dc0224fc50e89
parentfcc874fa183971c1985578dca66e4b4e49e17f43 (diff)
downloadmitmproxy-08fdd23e234ffaa11352891b103377240bc11fbe.tar.gz
mitmproxy-08fdd23e234ffaa11352891b103377240bc11fbe.tar.bz2
mitmproxy-08fdd23e234ffaa11352891b103377240bc11fbe.zip
Refactor the way we display flows.
Use columns to make spacing nicer, and to ensure that long URLs don't bugger up formatting when they spill into the next line.
-rw-r--r--libmproxy/console/common.py98
-rw-r--r--libmproxy/console/connlist.py3
-rw-r--r--libmproxy/console/connview.py4
3 files changed, 62 insertions, 43 deletions
diff --git a/libmproxy/console/common.py b/libmproxy/console/common.py
index 28cf20cb..2d7209bc 100644
--- a/libmproxy/console/common.py
+++ b/libmproxy/console/common.py
@@ -70,60 +70,80 @@ def shortcuts(k):
return k
+def fcol(s, attr):
+ s = str(s)
+ return (
+ "fixed",
+ len(s),
+ urwid.Text(
+ [
+ (attr, s)
+ ]
+ )
+ )
+
+
def format_flow(f, focus, extended=False, padding=2):
- txt = []
+ pile = []
+
+ req = []
if extended:
- txt.append(("highlight", utils.format_timestamp(f.request.timestamp)))
- txt.append(" ")
+ req.append(
+ fcol(
+ utils.format_timestamp(f.request.timestamp),
+ "highlight"
+ )
+ )
+ else:
+ req.append(fcol(">>" if focus else " ", "focus"))
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 = " "
+ req.append(fcol("[replay]", "method"))
+ req.append(fcol(f.request.method, "method"))
- txt.append("\n")
- txt.append(("text", ts))
- txt.append(" "*(padding+2))
+ preamble = sum(i[1] for i in req) + len(req) -1
+ req.append(
+ urwid.Text([
+ (
+ "text" if (f.response or f.error) else "title",
+ f.request.get_url(),
+ )
+ ])
+ )
+
+ pile.append(urwid.Columns(req, dividechars=1))
+
+ resp = []
+ resp.append(
+ ("fixed", preamble, urwid.Text(""))
+ )
+
+ if f.response or f.error:
+ resp.append(fcol("<-", "method"))
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] "))
+ resp.append("[replay]", "method")
if f.response.code in [200, 304]:
- txt.append(("goodcode", str(f.response.code)))
+ resp.append(fcol(f.response.code, "goodcode"))
else:
- txt.append(("error", str(f.response.code)))
+ resp.append(fcol(f.response.code, "error"))
t = f.response.headers["content-type"]
if t:
t = t[0].split(";")[0]
- txt.append(("text", " %s"%t))
+ resp.append(fcol(t, "text"))
if f.response.content:
- txt.append(", %s"%utils.pretty_size(len(f.response.content)))
+ resp.append(fcol(utils.pretty_size(len(f.response.content)), "text"))
elif f.error:
- txt.append(
- ("error", f.error.msg)
+ resp.append(
+ urwid.Text([
+ (
+ "error",
+ f.error.msg
+ )
+ ])
)
-
- if focus:
- txt.insert(0, ("focus", ">>" + " "*(padding-2)))
- else:
- txt.insert(0, " "*padding)
- return txt
+ pile.append(urwid.Columns(resp, dividechars=1))
+ return urwid.Pile(pile)
def int_version(v):
diff --git a/libmproxy/console/connlist.py b/libmproxy/console/connlist.py
index a06f3e65..4e8bfebd 100644
--- a/libmproxy/console/connlist.py
+++ b/libmproxy/console/connlist.py
@@ -79,7 +79,6 @@ class BodyPile(urwid.Pile):
return self.focus_item.keypress( tsize, key )
-
class ConnectionItem(common.WWrap):
def __init__(self, master, state, flow, focus):
self.master, self.state, self.flow = master, state, flow
@@ -88,7 +87,7 @@ class ConnectionItem(common.WWrap):
common.WWrap.__init__(self, w)
def get_text(self):
- return urwid.Text(common.format_flow(self.flow, self.focus))
+ return common.format_flow(self.flow, self.focus)
def selectable(self):
return True
diff --git a/libmproxy/console/connview.py b/libmproxy/console/connview.py
index 80750f99..c9667ed2 100644
--- a/libmproxy/console/connview.py
+++ b/libmproxy/console/connview.py
@@ -45,11 +45,11 @@ VIEW_CUTOFF = 1024*100
class ConnectionViewHeader(common.WWrap):
def __init__(self, master, f):
self.master, self.flow = master, f
- self.w = urwid.Text(common.format_flow(f, False, extended=True, padding=0))
+ self.w = common.format_flow(f, False, extended=True, padding=0)
def refresh_connection(self, f):
if f == self.flow:
- self.w = urwid.Text(common.format_flow(f, False, extended=True, padding=0))
+ self.w = common.format_flow(f, False, extended=True, padding=0)
class CallbackCache: