diff options
Diffstat (limited to 'test/tservers.py')
-rw-r--r-- | test/tservers.py | 69 |
1 files changed, 55 insertions, 14 deletions
diff --git a/test/tservers.py b/test/tservers.py index ac95b168..812e8921 100644 --- a/test/tservers.py +++ b/test/tservers.py @@ -21,13 +21,12 @@ def errapp(environ, start_response): class TestMaster(flow.FlowMaster): - def __init__(self, testq, config): + def __init__(self, config): s = proxy.ProxyServer(config, 0) state = flow.State() flow.FlowMaster.__init__(self, s, state) self.apps.add(testapp, "testapp", 80) self.apps.add(errapp, "errapp", 80) - self.testq = testq self.clear_log() self.start_app(APP_HOST, APP_PORT, False) @@ -51,11 +50,12 @@ class ProxyThread(threading.Thread): def __init__(self, tmaster): threading.Thread.__init__(self) self.tmaster = tmaster + self.name = "ProxyThread (%s:%s)" % (tmaster.server.address.host, tmaster.server.address.port) controller.should_exit = False @property def port(self): - return self.tmaster.server.port + return self.tmaster.server.address.port @property def log(self): @@ -68,7 +68,7 @@ class ProxyThread(threading.Thread): self.tmaster.shutdown() -class ProxTestBase: +class ProxTestBase(object): # Test Configuration ssl = None ssloptions = False @@ -79,17 +79,16 @@ class ProxTestBase: masterclass = TestMaster @classmethod def setupAll(cls): - cls.tqueue = Queue.Queue() cls.server = libpathod.test.Daemon(ssl=cls.ssl, ssloptions=cls.ssloptions) cls.server2 = libpathod.test.Daemon(ssl=cls.ssl, ssloptions=cls.ssloptions) pconf = cls.get_proxy_config() config = proxy.ProxyConfig( no_upstream_cert = cls.no_upstream_cert, - cacert = tutils.test_data.path("data/serverkey.pem"), + cacert = tutils.test_data.path("data/confdir/mitmproxy-ca.pem"), authenticator = cls.authenticator, **pconf ) - tmaster = cls.masterclass(cls.tqueue, config) + tmaster = cls.masterclass(config) cls.proxy = ProxyThread(tmaster) cls.proxy.start() @@ -134,13 +133,13 @@ class ProxTestBase: class HTTPProxTest(ProxTestBase): def pathoc_raw(self): - return libpathod.pathoc.Pathoc("127.0.0.1", self.proxy.port) + return libpathod.pathoc.Pathoc(("127.0.0.1", self.proxy.port)) def pathoc(self, sni=None): """ Returns a connected Pathoc instance. """ - p = libpathod.pathoc.Pathoc("localhost", self.proxy.port, ssl=self.ssl, sni=sni) + p = libpathod.pathoc.Pathoc(("localhost", self.proxy.port), ssl=self.ssl, sni=sni) if self.ssl: p.connect(("127.0.0.1", self.server.port)) else: @@ -161,10 +160,8 @@ class HTTPProxTest(ProxTestBase): def app(self, page): if self.ssl: - p = libpathod.pathoc.Pathoc("127.0.0.1", self.proxy.port, True) - print "PRE" + p = libpathod.pathoc.Pathoc(("127.0.0.1", self.proxy.port), True) p.connect((APP_HOST, APP_PORT)) - print "POST" return p.request("get:'/%s'"%page) else: p = self.pathoc() @@ -211,7 +208,7 @@ class TransparentProxTest(ProxTestBase): """ Returns a connected Pathoc instance. """ - p = libpathod.pathoc.Pathoc("localhost", self.proxy.port, ssl=self.ssl, sni=sni) + p = libpathod.pathoc.Pathoc(("localhost", self.proxy.port), ssl=self.ssl, sni=sni) p.connect() return p @@ -232,7 +229,7 @@ class ReverseProxTest(ProxTestBase): """ Returns a connected Pathoc instance. """ - p = libpathod.pathoc.Pathoc("localhost", self.proxy.port, ssl=self.ssl, sni=sni) + p = libpathod.pathoc.Pathoc(("localhost", self.proxy.port), ssl=self.ssl, sni=sni) p.connect() return p @@ -249,5 +246,49 @@ class ReverseProxTest(ProxTestBase): return p.request(q) +class ChainProxTest(ProxTestBase): + """ + Chain n instances of mitmproxy in a row - because we can. + """ + n = 2 + chain_config = [lambda: proxy.ProxyConfig( + cacert = tutils.test_data.path("data/confdir/mitmproxy-ca.pem"), + )] * n + @classmethod + def setupAll(cls): + super(ChainProxTest, cls).setupAll() + cls.chain = [] + for i in range(cls.n): + config = cls.chain_config[i]() + config.forward_proxy = ("http", "127.0.0.1", + cls.proxy.port if i == 0 else + cls.chain[-1].port + ) + tmaster = cls.masterclass(config) + cls.chain.append(ProxyThread(tmaster)) + cls.chain[-1].start() + @classmethod + def teardownAll(cls): + super(ChainProxTest, cls).teardownAll() + for p in cls.chain: + p.tmaster.server.shutdown() + def setUp(self): + super(ChainProxTest, self).setUp() + for p in self.chain: + p.tmaster.clear_log() + p.tmaster.state.clear() + + +class HTTPChainProxyTest(ChainProxTest): + def pathoc(self, sni=None): + """ + Returns a connected Pathoc instance. + """ + p = libpathod.pathoc.Pathoc(("localhost", self.chain[-1].port), ssl=self.ssl, sni=sni) + if self.ssl: + p.connect(("127.0.0.1", self.server.port)) + else: + p.connect() + return p |