mitmproxy/mitmproxy/tools/console/flowdetailview.py

186 lines
5.6 KiB
Python
Raw Normal View History

import urwid
2016-06-01 02:06:57 +00:00
from mitmproxy import http
from mitmproxy.tools.console import common, searchable
2016-10-19 20:45:18 +00:00
from mitmproxy.utils import human
2016-12-20 15:49:38 +00:00
from mitmproxy.utils import strutils
def maybe_timestamp(base, attr):
2016-04-02 19:33:51 +00:00
if base is not None and getattr(base, attr):
return human.format_timestamp_with_milli(getattr(base, attr))
else:
return "active"
def flowdetails(state, flow: http.HTTPFlow):
text = []
sc = flow.server_conn
2016-11-22 21:22:56 +00:00
cc = flow.client_conn
req = flow.request
resp = flow.response
2016-11-22 21:22:56 +00:00
metadata = flow.metadata
if metadata is not None and len(metadata) > 0:
2016-11-22 21:22:56 +00:00
parts = [[str(k), repr(v)] for k, v in metadata.items()]
text.append(urwid.Text([("head", "Metadata:")]))
text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
if sc is not None:
text.append(urwid.Text([("head", "Server Connection:")]))
parts = [
["Address", "{}:{}".format(sc.address[0], sc.address[1])],
["Resolved Address", "{}:{}".format(sc.ip_address[0], sc.ip_address[1])],
]
if resp:
parts.append(["HTTP Version", resp.http_version])
2016-12-17 12:49:18 +00:00
if sc.alpn_proto_negotiated:
parts.append(["ALPN", sc.alpn_proto_negotiated])
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 = [
2015-05-30 00:03:28 +00:00
["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)
)
]
]
2015-03-04 17:02:01 +00:00
if c.altnames:
parts.append(
[
"Alt names",
2016-12-20 15:49:38 +00:00
", ".join(strutils.bytes_to_escaped_str(x) for x in c.altnames)
]
)
text.extend(
common.format_keyvals(parts, key="key", val="text", indent=4)
)
if cc is not None:
text.append(urwid.Text([("head", "Client Connection:")]))
parts = [
["Address", "{}:{}".format(cc.address[0], cc.address[1])],
]
if req:
parts.append(["HTTP Version", req.http_version])
2016-10-26 06:36:14 +00:00
if cc.tls_version:
parts.append(["TLS Version", cc.tls_version])
if cc.sni:
parts.append(["Server Name Indication", cc.sni])
if cc.cipher_name:
parts.append(["Cipher Name", cc.cipher_name])
2016-12-17 12:49:18 +00:00
if cc.alpn_proto_negotiated:
parts.append(["ALPN", cc.alpn_proto_negotiated])
2015-03-04 17:02:01 +00:00
text.extend(
common.format_keyvals(parts, key="key", val="text", indent=4)
)
2015-03-03 21:38:16 +00:00
parts = []
2016-04-02 19:33:51 +00:00
if cc is not None and cc.timestamp_start:
parts.append(
[
2016-04-02 19:33:51 +00:00
"Client conn. established",
maybe_timestamp(cc, "timestamp_start")
]
)
2016-04-02 19:33:51 +00:00
if cc.ssl_established:
parts.append(
[
"Client conn. TLS handshake",
maybe_timestamp(cc, "timestamp_ssl_setup")
]
)
2016-11-22 21:22:56 +00:00
2016-04-02 19:33:51 +00:00
if sc is not None and sc.timestamp_start:
parts.append(
[
2016-04-02 19:33:51 +00:00
"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. TLS handshake",
maybe_timestamp(sc, "timestamp_ssl_setup")
]
)
2016-11-22 21:22:56 +00:00
2016-04-02 19:33:51 +00:00
if req is not None and req.timestamp_start:
parts.append(
[
"First request byte",
maybe_timestamp(req, "timestamp_start")
]
)
parts.append(
[
"Request complete",
maybe_timestamp(req, "timestamp_end")
]
)
2016-11-22 21:22:56 +00:00
2016-04-02 19:33:51 +00:00
if resp is not None and resp.timestamp_start:
parts.append(
[
"First response byte",
maybe_timestamp(resp, "timestamp_start")
]
)
parts.append(
[
"Response complete",
maybe_timestamp(resp, "timestamp_end")
]
)
2016-04-02 19:33:51 +00:00
if parts:
# sort operations by timestamp
parts = sorted(parts, key=lambda p: p[1])
2016-04-02 19:33:51 +00:00
text.append(urwid.Text([("head", "Timing:")]))
text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
2016-11-22 21:22:56 +00:00
return searchable.Searchable(state, text)