Unit tests and minor code refactoring for ServerConnection.

This commit is contained in:
Aldo Cortesi 2013-01-05 19:44:12 -08:00
parent 060e3198bc
commit d0ee4d60d0
4 changed files with 57 additions and 16 deletions

View File

@ -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()

View File

@ -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)

View File

@ -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

View File

@ -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.