diff options
Diffstat (limited to 'libmproxy')
-rw-r--r-- | libmproxy/dump.py | 88 | ||||
-rw-r--r-- | libmproxy/flow.py | 8 | ||||
-rw-r--r-- | libmproxy/proxy.py | 2 |
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: |