From d0ee4d60d09c607a208ae1b190e619a4f106538e Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sat, 5 Jan 2013 19:44:12 -0800 Subject: [PATCH] Unit tests and minor code refactoring for ServerConnection. --- libmproxy/proxy.py | 12 ++++++------ test/test_proxy.py | 32 +++++++++++++++++++++++++++++++- test/test_server.py | 24 +++++++++++++++--------- test/tutils.py | 5 +++++ 4 files changed, 57 insertions(+), 16 deletions(-) diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py index 370eca9a8..2485a0c98 100644 --- a/libmproxy/proxy.py +++ b/libmproxy/proxy.py @@ -48,9 +48,9 @@ class ProxyConfig: self.reverse_proxy = reverse_proxy self.transparent_proxy = transparent_proxy self.authenticator = authenticator - self.certstore = certutils.CertStore(certdir) + class RequestReplayThread(threading.Thread): def __init__(self, config, flow, masterq): self.config, self.flow, self.masterq = config, flow, masterq @@ -86,7 +86,7 @@ class ServerConnection(tcp.TCPClient): clientcert = None if self.config.clientcerts: path = os.path.join(self.config.clientcerts, self.host) + ".pem" - if os.path.exists(clientcert): + if os.path.exists(path): clientcert = path try: self.convert_to_ssl(clientcert=clientcert, sni=self.host) @@ -95,10 +95,10 @@ class ServerConnection(tcp.TCPClient): def send(self, request): self.requestcount += 1 + d = request._assemble() + if not d: + raise ProxyError(502, "Cannot transmit an incomplete request.") try: - d = request._assemble() - if not d: - raise ProxyError(502, "Incomplete request could not not be readied for transmission.") self.wfile.write(d) self.wfile.flush() except socket.error, err: @@ -373,7 +373,7 @@ class ProxyHandler(tcp.BaseHandler): def send_response(self, response): d = response._assemble() if not d: - raise ProxyError(502, "Incomplete response could not not be readied for transmission.") + raise ProxyError(502, "Cannot transmit an incomplete response.") self.wfile.write(d) self.wfile.flush() diff --git a/test/test_proxy.py b/test/test_proxy.py index e137c6879..89e5a8253 100644 --- a/test/test_proxy.py +++ b/test/test_proxy.py @@ -1,5 +1,7 @@ -from libmproxy import proxy +from libmproxy import proxy, flow import tutils +from libpathod import test +from netlib import http def test_proxy_error(): @@ -26,3 +28,31 @@ def test_app_registry(): assert not ar.get(r) r.headers["host"] = ["domain"] assert ar.get(r) + + + +class TestServerConnection: + def setUp(self): + self.d = test.Daemon() + + def tearDown(self): + self.d.shutdown() + + def test_simple(self): + sc = proxy.ServerConnection(proxy.ProxyConfig(), self.d.IFACE, self.d.port) + sc.connect("http") + r = tutils.treq() + r.path = "/p/200:da" + sc.send(r) + assert http.read_response(sc.rfile, r.method, 1000) + assert self.d.last_log() + + r.content = flow.CONTENT_MISSING + tutils.raises("incomplete request", sc.send, r) + + def test_send_error(self): + sc = proxy.ServerConnection(proxy.ProxyConfig(), self.d.IFACE, self.d.port) + sc.connect("http") + r = tutils.treq() + sc.send(r) + diff --git a/test/test_server.py b/test/test_server.py index 38d33d902..ba263e96b 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -1,4 +1,5 @@ from netlib import tcp +from libpathod import pathoc import tutils """ @@ -52,6 +53,20 @@ class TestHTTP(tutils.HTTPProxTest, SanityMixin): t.wfile.flush() assert "Bad Request" in t.rfile.readline() + def test_upstream_ssl_error(self): + p = self.pathoc() + ret = p.request("get:'https://localhost:%s/'"%self.server.port) + assert ret[1] == 400 + + def test_http(self): + f = self.pathod("304") + assert f.status_code == 304 + + l = self.master.state.view[0] + assert l.request.client_conn.address + assert "host" in l.request.headers + assert l.response.code == 304 + class TestHTTPS(tutils.HTTPProxTest, SanityMixin): ssl = True @@ -65,12 +80,3 @@ class TestTransparent(tutils.TransparentProxTest, SanityMixin): transparent = True -class TestProxy(tutils.HTTPProxTest): - def test_http(self): - f = self.pathod("304") - assert f.status_code == 304 - - l = self.master.state.view[0] - assert l.request.client_conn.address - assert "host" in l.request.headers - assert l.response.code == 304 diff --git a/test/tutils.py b/test/tutils.py index 5ce56cb45..9b5ac0f16 100644 --- a/test/tutils.py +++ b/test/tutils.py @@ -127,6 +127,11 @@ class HTTPProxTest(ProxTestBase): def get_proxy_config(cls): return dict() + def pathoc(self, connect_to = None): + p = libpathod.pathoc.Pathoc("localhost", self.proxy.port) + p.connect(connect_to) + return p + def pathod(self, spec): """ Constructs a pathod request, with the appropriate base and proxy.