aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmproxy/dump.py88
-rw-r--r--libmproxy/flow.py8
-rw-r--r--libmproxy/proxy.py2
-rw-r--r--test/test_flow.py7
4 files changed, 60 insertions, 45 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:
diff --git a/test/test_flow.py b/test/test_flow.py
index 7ab8c753..78892b5d 100644
--- a/test/test_flow.py
+++ b/test/test_flow.py
@@ -308,13 +308,6 @@ class uState(libpry.AutoTree):
f = state.add_request(req)
f.error = proxy.Error(f.request, "msg")
- def test_kill_flow(self):
- c = flow.State()
- req = tutils.treq()
- f = c.add_request(req)
- c.kill_flow(f)
- assert not c.flow_count()
-
def test_clear(self):
c = flow.State()
f = self._add_request(c)