diff options
-rw-r--r-- | libmproxy/proxy.py | 8 | ||||
-rw-r--r-- | test/test_server.py | 6 | ||||
-rw-r--r-- | test/tservers.py | 23 |
3 files changed, 25 insertions, 12 deletions
diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py index 54cb6f8e..964c15a9 100644 --- a/libmproxy/proxy.py +++ b/libmproxy/proxy.py @@ -140,6 +140,13 @@ class ProxyHandler(tcp.BaseHandler): tcp.BaseHandler.__init__(self, connection, client_address, server) def get_server_connection(self, cc, scheme, host, port, sni): + """ + When SNI is in play, this means we have an SSL-encrypted + connection, which means that the entire handler is dedicated to a + single server connection - no multiplexing. If this assumption ever + breaks, we'll have to do something different with the SNI host + variable on the handler object. + """ sc = self.server_conn if not sni: sni = host @@ -329,7 +336,6 @@ class ProxyHandler(tcp.BaseHandler): raise ProxyError(400, str(v)) else: scheme = "http" - host = self.sni or host line = self.get_line(self.rfile) if line == "": return None diff --git a/test/test_server.py b/test/test_server.py index 244f972f..47bd56b1 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -160,6 +160,12 @@ class TestTransparent(tservers.TransparentProxTest, CommonMixin): class TestTransparentSSL(tservers.TransparentProxTest, CommonMixin): transparent = True ssl = True + def test_sni(self): + f = self.pathod("304", sni="testserver.com") + assert f.status_code == 304 + l = self.server.last_log() + assert self.server.last_log()["request"]["sni"] == "testserver.com" + class TestProxy(tservers.HTTPProxTest): diff --git a/test/tservers.py b/test/tservers.py index d1878f7a..12692369 100644 --- a/test/tservers.py +++ b/test/tservers.py @@ -172,23 +172,24 @@ class TransparentProxTest(ProxTestBase): ) return d - def pathod(self, spec): + def pathod(self, spec, sni=None): """ - Constructs a pathod request, with the appropriate base and proxy. + Constructs a pathod GET request, with the appropriate base and proxy. """ - r = hurl.get( - "%s://127.0.0.1:%s"%(self.scheme, self.proxy.port) + "/p/" + spec, - validate_cert=False, - #debug=hurl.utils.stdout_debug - ) - return r + if self.ssl: + p = self.pathoc(sni=sni) + q = "get:'/p/%s'"%spec + else: + p = self.pathoc() + q = "get:'/p/%s'"%spec + return p.request(q) - def pathoc(self, connect= None): + def pathoc(self, sni=None): """ Returns a connected Pathoc instance. """ - p = libpathod.pathoc.Pathoc("localhost", self.proxy.port) - p.connect(connect_to) + p = libpathod.pathoc.Pathoc("localhost", self.proxy.port, ssl=self.ssl, sni=sni) + p.connect() return p |