diff options
Diffstat (limited to 'libmproxy')
-rw-r--r-- | libmproxy/cmdline.py | 2 | ||||
-rw-r--r-- | libmproxy/console/__init__.py | 5 | ||||
-rw-r--r-- | libmproxy/console/contentview.py | 7 | ||||
-rw-r--r-- | libmproxy/console/flowview.py | 9 | ||||
-rw-r--r-- | libmproxy/console/grideditor.py | 2 | ||||
-rw-r--r-- | libmproxy/dump.py | 2 | ||||
-rw-r--r-- | libmproxy/flow.py | 8 | ||||
-rw-r--r-- | libmproxy/platform/lsof.py (renamed from libmproxy/platform/pf.py) | 9 | ||||
-rw-r--r-- | libmproxy/platform/osx.py | 8 |
9 files changed, 31 insertions, 21 deletions
diff --git a/libmproxy/cmdline.py b/libmproxy/cmdline.py index b76792cf..6b6c4241 100644 --- a/libmproxy/cmdline.py +++ b/libmproxy/cmdline.py @@ -124,7 +124,7 @@ def get_common_options(options): except ParseException, e: raise OptionException(e.message) try: - v = open(path, "r").read() + v = open(path, "rb").read() except IOError, e: raise OptionException("Could not read replace file: %s"%path) reps.append((patt, rex, v)) diff --git a/libmproxy/console/__init__.py b/libmproxy/console/__init__.py index fe75a047..ef799167 100644 --- a/libmproxy/console/__init__.py +++ b/libmproxy/console/__init__.py @@ -479,7 +479,7 @@ class ConsoleMaster(flow.FlowMaster): def _readflow(self, path): path = os.path.expanduser(path) try: - f = file(path, "r") + f = file(path, "rb") flows = list(flow.FlowReader(f).stream()) except (IOError, flow.FlowReadError), v: return True, v.strerror @@ -519,13 +519,14 @@ class ConsoleMaster(flow.FlowMaster): except: self.statusbar.message("Can't start editor: %s" % " ".join(c)) else: - data = open(name).read() + data = open(name,"rb").read() self.ui.start() os.unlink(name) return data def spawn_external_viewer(self, data, contenttype): if contenttype: + contenttype = contenttype.split(";")[0] ext = mimetypes.guess_extension(contenttype) or "" else: ext = "" diff --git a/libmproxy/console/contentview.py b/libmproxy/console/contentview.py index 53841c73..8dd8ad1d 100644 --- a/libmproxy/console/contentview.py +++ b/libmproxy/console/contentview.py @@ -389,8 +389,11 @@ class ViewProtobuf: stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, _ = p.communicate(input=content) - return out + out, err = p.communicate(input=content) + if out: + return out + else: + return err def __call__(self, hdrs, content, limit): decoded = self.decode_protobuf(content) diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index 8932b912..da5a6c65 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -16,7 +16,7 @@ import os, sys import urwid import common, grideditor, contentview -from .. import utils, flow +from .. import utils, flow, controller def _mkhelp(): text = [] @@ -341,7 +341,12 @@ class FlowView(common.WWrap): conn = self.flow.request else: if not self.flow.response: - self.flow.response = flow.Response(self.flow.request, 200, "OK", flow.ODictCaseless(), "", None) + self.flow.response = flow.Response( + self.flow.request, + self.flow.request.httpversion, + 200, "OK", flow.ODictCaseless(), "", None + ) + self.flow.response.reply = controller.DummyReply() conn = self.flow.response self.flow.backup() diff --git a/libmproxy/console/grideditor.py b/libmproxy/console/grideditor.py index 314d6e88..55f3ba0f 100644 --- a/libmproxy/console/grideditor.py +++ b/libmproxy/console/grideditor.py @@ -294,7 +294,7 @@ class GridEditor(common.WWrap): if p: try: p = os.path.expanduser(p) - d = file(p, "r").read() + d = file(p, "rb").read() self.walker.set_current_value(d, unescaped) self.walker._modified() except IOError, v: diff --git a/libmproxy/dump.py b/libmproxy/dump.py index b1022ef5..06c15c63 100644 --- a/libmproxy/dump.py +++ b/libmproxy/dump.py @@ -141,7 +141,7 @@ class DumpMaster(flow.FlowMaster): def _readflow(self, path): path = os.path.expanduser(path) try: - f = file(path, "r") + f = file(path, "rb") flows = list(flow.FlowReader(f).stream()) except (IOError, flow.FlowReadError), v: raise DumpError(v.strerror) diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 50b30fe1..10c5da5d 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -542,7 +542,7 @@ class Request(HTTPMsg): headers["host"] = [utils.hostport(self.scheme, self.host, self.port)] content = self.content if content: - headers["content-length"] = [str(len(content))] + headers["Content-Length"] = [str(len(content))] else: content = "" if self.close: @@ -737,7 +737,7 @@ class Response(HTTPMsg): ['proxy-connection', 'transfer-encoding'] ) if self.content: - headers["content-length"] = [str(len(self.content))] + headers["Content-Length"] = [str(len(self.content))] proto = "HTTP/%s.%s %s %s"%(self.httpversion[0], self.httpversion[1], self.code, str(self.msg)) data = (proto, str(headers)) return FMT%data @@ -827,7 +827,6 @@ class ClientConnect(StateObject): def __str__(self): if self.address: return "%s:%d"%(self.address[0],self.address[1]) - return "None" def _load_state(self, state): self.close = True @@ -934,6 +933,7 @@ class ClientPlaybackState: """ if self.flows and not self.current: n = self.flows.pop(0) + n.request.reply = controller.DummyReply() n.request.client_conn = None self.current = master.handle_request(n.request) if not testing and not self.current.response: @@ -1548,7 +1548,7 @@ class FlowMaster(controller.Master): if f.request: f.request._set_replay() if f.request.content: - f.request.headers["content-length"] = [str(len(f.request.content))] + f.request.headers["Content-Length"] = [str(len(f.request.content))] f.response = None f.error = None self.process_new_request(f) diff --git a/libmproxy/platform/pf.py b/libmproxy/platform/lsof.py index 062d3311..25c0e33f 100644 --- a/libmproxy/platform/pf.py +++ b/libmproxy/platform/lsof.py @@ -1,3 +1,4 @@ +import re def lookup(address, port, s): """ @@ -8,9 +9,9 @@ def lookup(address, port, s): """ spec = "%s:%s"%(address, port) for i in s.split("\n"): - if "ESTABLISHED:ESTABLISHED" in i and spec in i: - s = i.split() - if len(s) > 4: - s = s[4].split(":") + if "ESTABLISHED" in i and spec in i: + m = re.match(".* (\S*)->%s" % spec, i) + if m: + s = m.group(1).split(":") if len(s) == 2: return s[0], int(s[1]) diff --git a/libmproxy/platform/osx.py b/libmproxy/platform/osx.py index dda5d9af..1a474e94 100644 --- a/libmproxy/platform/osx.py +++ b/libmproxy/platform/osx.py @@ -1,16 +1,16 @@ import subprocess -import pf +import lsof """ Doing this the "right" way by using DIOCNATLOOK on the pf device turns out to be a pain. Apple has made a number of modifications to the data structures returned, and compiling userspace tools to test and work with - this turns out to be a pain in the ass. Parsing pfctl output is short, + this turns out to be a pain in the ass. Parsing lsof output is short, simple, and works. """ class Resolver: - STATECMD = ("sudo", "-n", "/sbin/pfctl", "-s", "state") + STATECMD = ("sudo", "-n", "/usr/sbin/lsof", "-n", "-P", "-i", "TCP") def __init__(self): pass @@ -20,4 +20,4 @@ class Resolver: stxt = subprocess.check_output(self.STATECMD, stderr=subprocess.STDOUT) except subprocess.CalledProcessError: return None - return pf.lookup(peer[0], peer[1], stxt) + return lsof.lookup(peer[0], peer[1], stxt) |