aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2013-07-24 10:32:56 +1200
committerAldo Cortesi <aldo@nullcube.com>2013-07-24 10:32:56 +1200
commit5c1157ddaf01b9245519d176469587aa6539ac5d (patch)
tree064877904e9a52199f5a84ea6d465b544d7c71ad
parent64ce3b358ffed2eb34d6836b57dd7849ce856a09 (diff)
downloadmitmproxy-5c1157ddaf01b9245519d176469587aa6539ac5d.tar.gz
mitmproxy-5c1157ddaf01b9245519d176469587aa6539ac5d.tar.bz2
mitmproxy-5c1157ddaf01b9245519d176469587aa6539ac5d.zip
Move app instantiation out of proxy.py.
-rw-r--r--libmproxy/cmdline.py18
-rw-r--r--libmproxy/console/__init__.py6
-rw-r--r--libmproxy/dump.py6
-rw-r--r--libmproxy/flow.py15
-rw-r--r--libmproxy/proxy.py19
-rwxr-xr-xmitmdump2
-rw-r--r--test/test_dump.py6
-rw-r--r--test/tservers.py9
8 files changed, 57 insertions, 24 deletions
diff --git a/libmproxy/cmdline.py b/libmproxy/cmdline.py
index 6b6c4241..9ed4ef7b 100644
--- a/libmproxy/cmdline.py
+++ b/libmproxy/cmdline.py
@@ -17,6 +17,9 @@ import proxy
import re, filt
import argparse
+APP_DOMAIN = "mitm"
+APP_IP = "1.1.1.1"
+
class ParseException(Exception): pass
class OptionException(Exception): pass
@@ -139,6 +142,10 @@ def get_common_options(options):
setheaders.append(p)
return dict(
+ app = options.app,
+ app_ip = options.app_ip,
+ app_domain = options.app_domain,
+
anticache = options.anticache,
anticomp = options.anticomp,
client_replay = options.client_replay,
@@ -267,6 +274,17 @@ def common_options(parser):
action="store_true", dest="app", default=False,
help="Enable the mitmproxy web app."
)
+ group.add_argument(
+ "--appdomain",
+ action="store", dest="app_domain", default=APP_DOMAIN, metavar="domain",
+ help="Domain to serve the app from."
+ )
+ group.add_argument(
+ "--appip",
+ action="store", dest="app_ip", default=APP_IP, metavar="ip",
+ help="""IP to serve the app from. Useful for transparent mode, when a DNS
+ entry for the app domain is not present."""
+ )
group = parser.add_argument_group("Client Replay")
group.add_argument(
diff --git a/libmproxy/console/__init__.py b/libmproxy/console/__init__.py
index ef799167..dd3adaa9 100644
--- a/libmproxy/console/__init__.py
+++ b/libmproxy/console/__init__.py
@@ -328,6 +328,9 @@ class ConsoleState(flow.State):
class Options(object):
attributes = [
+ "app",
+ "app_domain",
+ "app_ip",
"anticache",
"anticomp",
"client_replay",
@@ -426,6 +429,9 @@ class ConsoleMaster(flow.FlowMaster):
print >> sys.stderr, "Script load error:", err
sys.exit(1)
+ if options.app:
+ self.start_app(options.app_domain, options.app_ip)
+
def start_stream(self, path):
path = os.path.expanduser(path)
try:
diff --git a/libmproxy/dump.py b/libmproxy/dump.py
index 06c15c63..5a51919c 100644
--- a/libmproxy/dump.py
+++ b/libmproxy/dump.py
@@ -22,6 +22,9 @@ class DumpError(Exception): pass
class Options(object):
attributes = [
+ "app",
+ "app_domain",
+ "app_ip",
"anticache",
"anticomp",
"client_replay",
@@ -138,6 +141,9 @@ class DumpMaster(flow.FlowMaster):
except flow.FlowReadError, v:
self.add_event("Flow file corrupted. Stopped loading.")
+ if self.o.app:
+ self.start_app(self.o.app_domain, self.o.app_ip)
+
def _readflow(self, path):
path = os.path.expanduser(path)
try:
diff --git a/libmproxy/flow.py b/libmproxy/flow.py
index 427f1547..e5061dfb 100644
--- a/libmproxy/flow.py
+++ b/libmproxy/flow.py
@@ -1376,6 +1376,18 @@ class FlowMaster(controller.Master):
self.stream = None
app.mapp.config["PMASTER"] = self
+ def start_app(self, domain, ip):
+ self.server.apps.add(
+ app.mapp,
+ domain,
+ 80
+ )
+ self.server.apps.add(
+ app.mapp,
+ ip,
+ 80
+ )
+
def add_event(self, e, level="info"):
"""
level: info, error
@@ -1655,7 +1667,7 @@ class FlowReader:
try:
while 1:
data = tnetstring.load(self.fo)
- if tuple(data["version"][:1]) != version.IVERSION[:1]:
+ if tuple(data["version"][:2]) != version.IVERSION[:2]:
v = ".".join(str(i) for i in data["version"])
raise FlowReadError("Incompatible serialized data version: %s"%v)
off = self.fo.tell()
@@ -1678,4 +1690,3 @@ class FilteredFlowWriter:
d = f._get_state()
tnetstring.dump(d, self.fo)
-
diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py
index e68aae87..a7d8d2ba 100644
--- a/libmproxy/proxy.py
+++ b/libmproxy/proxy.py
@@ -17,11 +17,9 @@ import shutil, tempfile, threading
import SocketServer
from OpenSSL import SSL
from netlib import odict, tcp, http, wsgi, certutils, http_status, http_auth
-import utils, flow, version, platform, controller, app
+import utils, flow, version, platform, controller
-APP_DOMAIN = "mitm"
-APP_IP = "1.1.1.1"
KILL = 0
@@ -39,8 +37,7 @@ class Log:
class ProxyConfig:
- def __init__(self, app=False, certfile = None, cacert = None, clientcerts = None, no_upstream_cert=False, body_size_limit = None, reverse_proxy=None, transparent_proxy=None, certdir = None, authenticator=None):
- self.app = app
+ def __init__(self, certfile = None, cacert = None, clientcerts = None, no_upstream_cert=False, body_size_limit = None, reverse_proxy=None, transparent_proxy=None, certdir = None, authenticator=None):
self.certfile = certfile
self.cacert = cacert
self.clientcerts = clientcerts
@@ -512,17 +509,6 @@ class ProxyServer(tcp.TCPServer):
raise ProxyServerError('Error starting proxy server: ' + v.strerror)
self.channel = None
self.apps = AppRegistry()
- if config.app:
- self.apps.add(
- app.mapp,
- APP_DOMAIN,
- 80
- )
- self.apps.add(
- app.mapp,
- APP_IP,
- 80
- )
def start_slave(self, klass, channel):
slave = klass(channel, self)
@@ -655,7 +641,6 @@ def process_proxy_options(parser, options):
authenticator = http_auth.NullProxyAuth(None)
return ProxyConfig(
- app = options.app,
certfile = options.cert,
cacert = cacert,
clientcerts = options.clientcerts,
diff --git a/mitmdump b/mitmdump
index da3c80e1..f82e94f4 100755
--- a/mitmdump
+++ b/mitmdump
@@ -70,5 +70,3 @@ if __name__ == '__main__':
except KeyboardInterrupt:
pass
-
-
diff --git a/test/test_dump.py b/test/test_dump.py
index 6a35cdec..b195d5f0 100644
--- a/test/test_dump.py
+++ b/test/test_dump.py
@@ -106,6 +106,12 @@ class TestDumpMaster:
def test_filter(self):
assert not "GET" in self._dummy_cycle(1, "~u foo", "", verbosity=1)
+ def test_app(self):
+ o = dump.Options(app=True)
+ s = mock.MagicMock()
+ m = dump.DumpMaster(s, o, None)
+ assert s.apps.add.call_count == 2
+
def test_replacements(self):
o = dump.Options(replacements=[(".*", "content", "foo")])
m = dump.DumpMaster(None, o, None)
diff --git a/test/tservers.py b/test/tservers.py
index 1197fb69..0606bd9c 100644
--- a/test/tservers.py
+++ b/test/tservers.py
@@ -4,6 +4,9 @@ import libpathod.test, libpathod.pathoc
from libmproxy import proxy, flow, controller
import tutils
+APP_DOMAIN = "mitm"
+APP_IP = "1.1.1.1"
+
testapp = flask.Flask(__name__)
@testapp.route("/")
@@ -28,6 +31,7 @@ class TestMaster(flow.FlowMaster):
flow.FlowMaster.__init__(self, s, state)
self.testq = testq
self.clear_log()
+ self.start_app(APP_DOMAIN, APP_IP)
def handle_request(self, m):
flow.FlowMaster.handle_request(self, m)
@@ -85,7 +89,6 @@ class ProxTestBase:
no_upstream_cert = cls.no_upstream_cert,
cacert = tutils.test_data.path("data/serverkey.pem"),
authenticator = cls.authenticator,
- app = True,
**pconf
)
tmaster = cls.masterclass(cls.tqueue, config)
@@ -162,12 +165,12 @@ class HTTPProxTest(ProxTestBase):
if self.ssl:
p = libpathod.pathoc.Pathoc("127.0.0.1", self.proxy.port, True)
print "PRE"
- p.connect((proxy.APP_IP, 80))
+ p.connect((APP_IP, 80))
print "POST"
return p.request("get:'/%s'"%page)
else:
p = self.pathoc()
- return p.request("get:'http://%s/%s'"%(proxy.APP_DOMAIN, page))
+ return p.request("get:'http://%s/%s'"%(APP_DOMAIN, page))
class TResolver: