aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/console.py
diff options
context:
space:
mode:
Diffstat (limited to 'libmproxy/console.py')
-rw-r--r--libmproxy/console.py63
1 files changed, 38 insertions, 25 deletions
diff --git a/libmproxy/console.py b/libmproxy/console.py
index 12f6dec9..c48a41bc 100644
--- a/libmproxy/console.py
+++ b/libmproxy/console.py
@@ -44,46 +44,46 @@ def format_keyvals(lst, key="key", val="text", space=5, indent=0):
return ret
-def format_flow(flow, focus, padding=3):
- if not flow.request and not flow.response:
+def format_flow(f, focus, padding=3):
+ if not f.request and not f.response:
txt = [
- ("title", " Connection from %s..."%(flow.connection.address)),
+ ("title", " Connection from %s..."%(f.connection.address)),
]
else:
txt = [
- ("ack", "!") if flow.intercepting and not flow.request.acked else " ",
- ("method", flow.request.method),
+ ("ack", "!") if f.intercepting and not f.request.acked else " ",
+ ("method", f.request.method),
" ",
(
- "text" if (flow.response or flow.error) else "title",
- flow.request.url(),
+ "text" if (f.response or f.error) else "title",
+ f.request.url(),
),
]
- if flow.response or flow.error or flow.is_replay():
+ if f.response or f.error or f.is_replay():
txt.append("\n" + " "*(padding+2))
- if flow.is_replay():
+ if f.is_replay():
txt.append(("method", "[replay] "))
- if not (flow.response or flow.error):
+ if not (f.response or f.error):
txt.append(("text", "waiting for response..."))
- if flow.response:
+ if f.response:
txt.append(
- ("ack", "!") if flow.intercepting and not flow.response.acked else " "
+ ("ack", "!") if f.intercepting and not f.response.acked else " "
)
txt.append("<- ")
- if flow.response.code in [200, 304]:
- txt.append(("goodcode", str(flow.response.code)))
+ if f.response.code in [200, 304]:
+ txt.append(("goodcode", str(f.response.code)))
else:
- txt.append(("error", str(flow.response.code)))
- t = flow.response.headers.get("content-type")
+ txt.append(("error", str(f.response.code)))
+ t = f.response.headers.get("content-type")
if t:
t = t[0].split(";")[0]
txt.append(("text", " %s"%t))
- if flow.response.content:
- txt.append(", %s"%utils.pretty_size(len(flow.response.content)))
- elif flow.error:
+ if f.response.content:
+ txt.append(", %s"%utils.pretty_size(len(f.response.content)))
+ elif f.error:
txt.append(
- ("error", flow.error.msg)
+ ("error", f.error.msg)
)
if focus:
txt.insert(0, ("focus", ">>" + " "*(padding-2)))
@@ -193,13 +193,13 @@ class ConnectionListView(urwid.ListWalker):
class ConnectionViewHeader(WWrap):
- def __init__(self, master, flow):
- self.master, self.flow = master, flow
- self.w = urwid.Text(format_flow(flow, False, padding=0))
+ def __init__(self, master, f):
+ self.master, self.flow = master, f
+ self.w = urwid.Text(format_flow(f, False, padding=0))
- def refresh_connection(self, flow):
+ def refresh_connection(self, f):
if f == self.flow:
- self.w = urwid.Text(format_flow(flow, False, padding=0))
+ self.w = urwid.Text(format_flow(f, False, padding=0))
VIEW_BODY_RAW = 0
@@ -520,8 +520,20 @@ class ConnectionView(WWrap):
self.master.prompt("Save response body: ", self.save_body)
elif key == " ":
self.master.view_next_flow(self.flow)
+ elif key == "|":
+ self.master.path_prompt("Script:", self.run_script)
return key
+ def run_script(self, path):
+ path = os.path.expanduser(path)
+ try:
+ newflow = self.flow.run_script(path)
+ except flow.RunException, e:
+ self.master.statusbar.message("Script error: %s"%e)
+ return
+ self.flow.load_state(newflow.get_state())
+ self.master.refresh_connection(self.flow)
+
class _PathCompleter:
DEFAULTPATH = "/bin:/usr/bin:/usr/local/bin"
@@ -942,6 +954,7 @@ class ConsoleMaster(controller.Master):
("s", "save this flow"),
("v", "view contents in external viewer"),
("w", "save request or response body"),
+ ("|", "run script"),
("tab", "toggle response/request view"),
("space", "next flow"),
]