aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/console/flowdetailview.py
diff options
context:
space:
mode:
Diffstat (limited to 'libmproxy/console/flowdetailview.py')
-rw-r--r--libmproxy/console/flowdetailview.py233
1 files changed, 137 insertions, 96 deletions
diff --git a/libmproxy/console/flowdetailview.py b/libmproxy/console/flowdetailview.py
index f351bff1..48845a62 100644
--- a/libmproxy/console/flowdetailview.py
+++ b/libmproxy/console/flowdetailview.py
@@ -1,113 +1,154 @@
from __future__ import absolute_import
import urwid
-from . import common
+from . import common, searchable
from .. import utils
-footer = [
- ('heading_key', "q"), ":back ",
-]
-class FlowDetailsView(urwid.ListBox):
- def __init__(self, master, flow, state):
- self.master, self.flow, self.state = master, flow, state
- urwid.ListBox.__init__(
- self,
- self.flowtext()
- )
+def maybe_timestamp(base, attr):
+ if base and getattr(base, attr):
+ return utils.format_timestamp_with_milli(getattr(base, attr))
+ else:
+ return "active"
+ pass
- def keypress(self, size, key):
- key = common.shortcuts(key)
- if key == "q":
- self.master.statusbar = self.state[0]
- self.master.body = self.state[1]
- self.master.header = self.state[2]
- self.master.loop.widget = self.master.make_view()
- return None
- elif key == "?":
- key = None
- return urwid.ListBox.keypress(self, size, key)
-
- def flowtext(self):
- text = []
-
- title = urwid.Text("Flow details")
- title = urwid.Padding(title, align="left", width=("relative", 100))
- title = urwid.AttrWrap(title, "heading")
- text.append(title)
-
- cc = self.flow.client_conn
- sc = self.flow.server_conn
- req = self.flow.request
- resp = self.flow.response
-
- if sc:
- text.append(urwid.Text([("head", "Server Connection:")]))
- parts = [
- ["Address", "%s:%s" % sc.address()],
- ]
- text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
-
- c = sc.cert
- if c:
- text.append(urwid.Text([("head", "Server Certificate:")]))
- parts = [
- ["Type", "%s, %s bits"%c.keyinfo],
- ["SHA1 digest", c.digest("sha1")],
- ["Valid to", str(c.notafter)],
- ["Valid from", str(c.notbefore)],
- ["Serial", str(c.serial)],
- [
- "Subject",
- urwid.BoxAdapter(
- urwid.ListBox(common.format_keyvals(c.subject, key="highlight", val="text")),
- len(c.subject)
- )
- ],
- [
- "Issuer",
- urwid.BoxAdapter(
- urwid.ListBox(common.format_keyvals(c.issuer, key="highlight", val="text")),
- len(c.issuer)
- )
- ]
- ]
+def flowdetails(state, flow):
+ text = []
- if c.altnames:
- parts.append(
- [
- "Alt names",
- ", ".join(c.altnames)
- ]
- )
- text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
+ cc = flow.client_conn
+ sc = flow.server_conn
+ req = flow.request
+ resp = flow.response
- if cc:
- text.append(urwid.Text([("head", "Client Connection:")]))
+ if sc:
+ text.append(urwid.Text([("head", "Server Connection:")]))
+ parts = [
+ ["Address", "%s:%s" % sc.address()],
+ ]
+
+ text.extend(
+ common.format_keyvals(parts, key="key", val="text", indent=4)
+ )
+ c = sc.cert
+ if c:
+ text.append(urwid.Text([("head", "Server Certificate:")]))
parts = [
- ["Address", "%s:%s" % cc.address()],
- # ["Requests", "%s"%cc.requestcount],
+ ["Type", "%s, %s bits"%c.keyinfo],
+ ["SHA1 digest", c.digest("sha1")],
+ ["Valid to", str(c.notafter)],
+ ["Valid from", str(c.notbefore)],
+ ["Serial", str(c.serial)],
+ [
+ "Subject",
+ urwid.BoxAdapter(
+ urwid.ListBox(
+ common.format_keyvals(
+ c.subject,
+ key="highlight",
+ val="text"
+ )
+ ),
+ len(c.subject)
+ )
+ ],
+ [
+ "Issuer",
+ urwid.BoxAdapter(
+ urwid.ListBox(
+ common.format_keyvals(
+ c.issuer, key="highlight", val="text"
+ )
+ ),
+ len(c.issuer)
+ )
+ ]
]
- text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
+ if c.altnames:
+ parts.append(
+ [
+ "Alt names",
+ ", ".join(c.altnames)
+ ]
+ )
+ text.extend(
+ common.format_keyvals(parts, key="key", val="text", indent=4)
+ )
- parts = []
+ if cc:
+ text.append(urwid.Text([("head", "Client Connection:")]))
- parts.append(["Client conn. established", utils.format_timestamp_with_milli(cc.timestamp_start) if (cc and cc.timestamp_start) else "active"])
- parts.append(["Server conn. initiated", utils.format_timestamp_with_milli(sc.timestamp_start) if sc else "active" ])
- parts.append(["Server conn. TCP handshake", utils.format_timestamp_with_milli(sc.timestamp_tcp_setup) if (sc and sc.timestamp_tcp_setup) else "active"])
- if sc.ssl_established:
- parts.append(["Server conn. SSL handshake", utils.format_timestamp_with_milli(sc.timestamp_ssl_setup) if sc.timestamp_ssl_setup else "active"])
- parts.append(["Client conn. SSL handshake", utils.format_timestamp_with_milli(cc.timestamp_ssl_setup) if (cc and cc.timestamp_ssl_setup) else "active"])
- parts.append(["First request byte", utils.format_timestamp_with_milli(req.timestamp_start)])
- parts.append(["Request complete", utils.format_timestamp_with_milli(req.timestamp_end) if req.timestamp_end else "active"])
- parts.append(["First response byte", utils.format_timestamp_with_milli(resp.timestamp_start) if resp else "active"])
- parts.append(["Response complete", utils.format_timestamp_with_milli(resp.timestamp_end) if (resp and resp.timestamp_end) else "active"])
+ parts = [
+ ["Address", "%s:%s" % cc.address()],
+ # ["Requests", "%s"%cc.requestcount],
+ ]
- # sort operations by timestamp
- parts = sorted(parts, key=lambda p: p[1])
+ text.extend(
+ common.format_keyvals(parts, key="key", val="text", indent=4)
+ )
- text.append(urwid.Text([("head", "Timing:")]))
- text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
- return text
+ parts = []
+
+ parts.append(
+ [
+ "Client conn. established",
+ maybe_timestamp(cc, "timestamp_start")
+ ]
+ )
+ parts.append(
+ [
+ "Server conn. initiated",
+ maybe_timestamp(sc, "timestamp_start")
+ ]
+ )
+ parts.append(
+ [
+ "Server conn. TCP handshake",
+ maybe_timestamp(sc, "timestamp_tcp_setup")
+ ]
+ )
+ if sc.ssl_established:
+ parts.append(
+ [
+ "Server conn. SSL handshake",
+ maybe_timestamp(sc, "timestamp_ssl_setup")
+ ]
+ )
+ parts.append(
+ [
+ "Client conn. SSL handshake",
+ maybe_timestamp(cc, "timestamp_ssl_setup")
+ ]
+ )
+ parts.append(
+ [
+ "First request byte",
+ maybe_timestamp(req, "timestamp_start")
+ ]
+ )
+ parts.append(
+ [
+ "Request complete",
+ maybe_timestamp(req, "timestamp_end")
+ ]
+ )
+ parts.append(
+ [
+ "First response byte",
+ maybe_timestamp(resp, "timestamp_start")
+ ]
+ )
+ parts.append(
+ [
+ "Response complete",
+ maybe_timestamp(resp, "timestamp_end")
+ ]
+ )
+
+ # sort operations by timestamp
+ parts = sorted(parts, key=lambda p: p[1])
+
+ text.append(urwid.Text([("head", "Timing:")]))
+ text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
+ return searchable.Searchable(state, text)