aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2011-03-11 13:06:51 +1300
committerAldo Cortesi <aldo@nullcube.com>2011-03-11 13:06:51 +1300
commit7d85db0da31186a5a80d3a925ab6382f6e5b42f9 (patch)
tree75b1066678711c1f72d878b90eb79e55850c1c61 /libmproxy
parentdaa9653ebebe73e1056d6dae14b11b0842ecbc2a (diff)
downloadmitmproxy-7d85db0da31186a5a80d3a925ab6382f6e5b42f9.tar.gz
mitmproxy-7d85db0da31186a5a80d3a925ab6382f6e5b42f9.tar.bz2
mitmproxy-7d85db0da31186a5a80d3a925ab6382f6e5b42f9.zip
Display Errors and killed connections in mitmdump.
Diffstat (limited to 'libmproxy')
-rw-r--r--libmproxy/dump.py88
-rw-r--r--libmproxy/flow.py8
-rw-r--r--libmproxy/proxy.py2
3 files changed, 60 insertions, 38 deletions
diff --git a/libmproxy/dump.py b/libmproxy/dump.py
index 9e439aaf..2eb0035e 100644
--- a/libmproxy/dump.py
+++ b/libmproxy/dump.py
@@ -121,44 +121,68 @@ class DumpMaster(flow.FlowMaster):
l = str(t).strip().split("\n")
return "\n".join(" "*n + i for i in l)
+ def _process_flow(self, f):
+ if self.filt and not f.match(self.filt):
+ return
+
+ if f.response:
+ sz = utils.pretty_size(len(f.response.content))
+ if self.o.verbosity > 0:
+ result = " << %s %s"%(str_response(f.response), sz)
+ if self.o.verbosity > 1:
+ result = result + "\n\n" + self.indent(4, f.response.headers)
+ if self.o.verbosity > 2:
+ if utils.isBin(f.response.content):
+ d = utils.hexdump(f.response.content)
+ d = "\n".join("%s\t%s %s"%i for i in d)
+ cont = self.indent(4, d)
+ elif f.response.content:
+ cont = self.indent(4, f.response.content)
+ else:
+ cont = ""
+ result = result + "\n\n" + cont
+ elif f.error:
+ result = " << %s"%f.error.msg
+
+ if self.o.verbosity == 1:
+ print >> self.outfile, str_request(f.request)
+ print >> self.outfile, result
+ elif self.o.verbosity == 2:
+ print >> self.outfile, str_request(f.request)
+ print >> self.outfile, self.indent(4, f.request.headers)
+ print >> self.outfile
+ print >> self.outfile, result
+ print >> self.outfile, "\n"
+ elif self.o.verbosity == 3:
+ print >> self.outfile, str_request(f.request)
+ print >> self.outfile, self.indent(4, f.request.headers)
+ if utils.isBin(f.request.content):
+ print >> self.outfile, self.indent(4, utils.hexdump(f.request.content))
+ elif f.request.content:
+ print >> self.outfile, self.indent(4, f.request.content)
+ print >> self.outfile
+ print >> self.outfile, result
+ print >> self.outfile, "\n"
+ self.state.delete_flow(f)
+ if self.o.wfile:
+ self.fwriter.add(f)
+
def handle_response(self, msg):
f = flow.FlowMaster.handle_response(self, msg)
if f:
msg.ack()
- if self.filt and not f.match(self.filt):
- return
- sz = utils.pretty_size(len(f.response.content))
- if self.o.verbosity == 1:
- print >> self.outfile, str_request(f.request)
- print >> self.outfile, " <<",
- print >> self.outfile, str_response(f.response), sz
- elif self.o.verbosity == 2:
- print >> self.outfile, str_request(f.request)
- print >> self.outfile, self.indent(4, f.request.headers)
- print >> self.outfile
- print >> self.outfile, " <<", str_response(f.response), sz
- print >> self.outfile, self.indent(4, f.response.headers)
- print >> self.outfile, "\n"
- elif self.o.verbosity == 3:
- print >> self.outfile, str_request(f.request)
- print >> self.outfile, self.indent(4, f.request.headers)
- if utils.isBin(f.request.content):
- print >> self.outfile, self.indent(4, utils.hexdump(f.request.content))
- elif f.request.content:
- print >> self.outfile, self.indent(4, f.request.content)
- print >> self.outfile
- print >> self.outfile, " <<", str_response(f.response), sz
- print >> self.outfile, self.indent(4, f.response.headers)
- if utils.isBin(f.response.content):
- print >> self.outfile, self.indent(4, utils.hexdump(f.response.content))
- elif f.response.content:
- print >> self.outfile, self.indent(4, f.response.content)
- print >> self.outfile, "\n"
- self.state.delete_flow(f)
- if self.o.wfile:
- self.fwriter.add(f)
+ self._process_flow(f)
return f
+ def handle_error(self, msg):
+ f = flow.FlowMaster.handle_error(self, msg)
+ if f:
+ msg.ack()
+ self._process_flow(f)
+ return f
+
+
+
# begin nocover
def run(self):
try:
diff --git a/libmproxy/flow.py b/libmproxy/flow.py
index e5f9c35f..60a6ebd2 100644
--- a/libmproxy/flow.py
+++ b/libmproxy/flow.py
@@ -288,6 +288,7 @@ class Flow:
return False
def kill(self):
+ self.error = proxy.Error(self.request, "Connection killed")
if self.request and not self.request.acked:
self.request.ack(None)
elif self.response and not self.response.acked:
@@ -399,10 +400,6 @@ class State:
for i in self.flow_list[:]:
i.accept_intercept()
- def kill_flow(self, f):
- f.kill()
- self.delete_flow(f)
-
def revert(self, f):
f.revert()
@@ -534,7 +531,8 @@ class FlowMaster(controller.Master):
pb = self.do_server_playback(f)
if not pb:
if self.kill_nonreplay:
- self.state.kill_flow(f)
+ f.kill()
+ self.handle_error(f.error)
else:
r.ack()
return f
diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py
index caa93f58..bff67000 100644
--- a/libmproxy/proxy.py
+++ b/libmproxy/proxy.py
@@ -577,7 +577,7 @@ class ProxyHandler(SocketServer.StreamRequestHandler):
self.finish()
def handle_request(self, cc):
- server, request = None, None
+ server, request, err = None, None, None
try:
request = self.read_request(cc)
if request is None: