diff options
Diffstat (limited to 'test/tservers.py')
-rw-r--r-- | test/tservers.py | 112 |
1 files changed, 89 insertions, 23 deletions
diff --git a/test/tservers.py b/test/tservers.py index 30c8b52e..c70ad68a 100644 --- a/test/tservers.py +++ b/test/tservers.py @@ -1,23 +1,28 @@ import os.path -import threading, Queue -import shutil, tempfile +import threading +import Queue +import shutil +import tempfile import flask import mock from libmproxy.proxy.config import ProxyConfig from libmproxy.proxy.server import ProxyServer from libmproxy.proxy.primitives import TransparentProxyMode -import libpathod.test, libpathod.pathoc +import libpathod.test +import libpathod.pathoc from libmproxy import flow, controller from libmproxy.cmdline import APP_HOST, APP_PORT import tutils testapp = flask.Flask(__name__) + @testapp.route("/") def hello(): return "testapp" + @testapp.route("/error") def error(): raise ValueError("An exception...") @@ -57,7 +62,8 @@ 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) + self.name = "ProxyThread (%s:%s)" % ( + tmaster.server.address.host, tmaster.server.address.port) controller.should_exit = False @property @@ -87,8 +93,12 @@ class ProxTestBase(object): @classmethod def setupAll(cls): - cls.server = libpathod.test.Daemon(ssl=cls.ssl, ssloptions=cls.ssloptions) - cls.server2 = libpathod.test.Daemon(ssl=cls.ssl, ssloptions=cls.ssloptions) + cls.server = libpathod.test.Daemon( + ssl=cls.ssl, + ssloptions=cls.ssloptions) + cls.server2 = libpathod.test.Daemon( + ssl=cls.ssl, + ssloptions=cls.ssloptions) cls.config = ProxyConfig(**cls.get_proxy_config()) @@ -129,13 +139,15 @@ class ProxTestBase(object): 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), fp=None) 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, fp=None + ) if self.ssl: p.connect(("127.0.0.1", self.server.port)) else: @@ -149,19 +161,21 @@ class HTTPProxTest(ProxTestBase): p = self.pathoc(sni=sni) spec = spec.encode("string_escape") if self.ssl: - q = "get:'/p/%s'"%spec + q = "get:'/p/%s'" % spec else: - q = "get:'%s/p/%s'"%(self.server.urlbase, spec) + q = "get:'%s/p/%s'" % (self.server.urlbase, spec) return p.request(q) def app(self, page): if self.ssl: - p = libpathod.pathoc.Pathoc(("127.0.0.1", self.proxy.port), True) + p = libpathod.pathoc.Pathoc( + ("127.0.0.1", self.proxy.port), True, fp=None + ) p.connect((APP_HOST, APP_PORT)) - return p.request("get:'%s'"%page) + return p.request("get:'%s'" % page) else: p = self.pathoc() - return p.request("get:'http://%s%s'"%(APP_HOST, page)) + return p.request("get:'http://%s%s'" % (APP_HOST, page)) class TResolver: @@ -184,7 +198,10 @@ class TransparentProxTest(ProxTestBase): ports = [cls.server.port, cls.server2.port] else: ports = [] - cls.config.mode = TransparentProxyMode(cls.resolver(cls.server.port), ports) + cls.config.mode = TransparentProxyMode( + cls.resolver( + cls.server.port), + ports) @classmethod def get_proxy_config(cls): @@ -198,23 +215,26 @@ class TransparentProxTest(ProxTestBase): """ if self.ssl: p = self.pathoc(sni=sni) - q = "get:'/p/%s'"%spec + q = "get:'/p/%s'" % spec else: p = self.pathoc() - q = "get:'/p/%s'"%spec + q = "get:'/p/%s'" % spec return p.request(q) 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, fp=None + ) p.connect() return p class ReverseProxTest(ProxTestBase): ssl = None + @classmethod def get_proxy_config(cls): d = ProxTestBase.get_proxy_config() @@ -231,7 +251,9 @@ 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, fp=None + ) p.connect() return p @@ -241,13 +263,56 @@ class ReverseProxTest(ProxTestBase): """ if self.ssl: p = self.pathoc(sni=sni) - q = "get:'/p/%s'"%spec + q = "get:'/p/%s'" % spec else: p = self.pathoc() - q = "get:'/p/%s'"%spec + q = "get:'/p/%s'" % spec return p.request(q) +class SpoofModeTest(ProxTestBase): + ssl = None + + @classmethod + def get_proxy_config(cls): + d = ProxTestBase.get_proxy_config() + d["upstream_server"] = None + d["mode"] = "spoof" + return d + + def pathoc(self, sni=None): + """ + Returns a connected Pathoc instance. + """ + p = libpathod.pathoc.Pathoc( + ("localhost", self.proxy.port), ssl=self.ssl, sni=sni, fp=None + ) + p.connect() + return p + + +class SSLSpoofModeTest(ProxTestBase): + ssl = True + + @classmethod + def get_proxy_config(cls): + d = ProxTestBase.get_proxy_config() + d["upstream_server"] = None + d["mode"] = "sslspoof" + d["spoofed_ssl_port"] = 443 + return d + + def pathoc(self, sni=None): + """ + Returns a connected Pathoc instance. + """ + p = libpathod.pathoc.Pathoc( + ("localhost", self.proxy.port), ssl=self.ssl, sni=sni, fp=None + ) + p.connect() + return p + + class ChainProxTest(ProxTestBase): """ Chain three instances of mitmproxy in a row to test upstream mode. @@ -270,8 +335,8 @@ class ChainProxTest(ProxTestBase): cls.chain.insert(0, proxy) # Patch the orginal proxy to upstream mode - cls.config = cls.proxy.tmaster.config = cls.proxy.tmaster.server.config = ProxyConfig(**cls.get_proxy_config()) - + cls.config = cls.proxy.tmaster.config = cls.proxy.tmaster.server.config = ProxyConfig( + **cls.get_proxy_config()) @classmethod def teardownAll(cls): @@ -295,5 +360,6 @@ class ChainProxTest(ProxTestBase): ) return d + class HTTPUpstreamProxTest(ChainProxTest, HTTPProxTest): - pass
\ No newline at end of file + pass |