2012-02-19 22:04:07 +00:00
|
|
|
import threading, Queue
|
2011-03-05 02:58:48 +00:00
|
|
|
import libpry
|
2012-02-19 22:04:07 +00:00
|
|
|
from libmproxy import proxy, flow, controller
|
2012-06-07 22:00:16 +00:00
|
|
|
import requests
|
|
|
|
import libpathod.test
|
2011-03-05 02:58:48 +00:00
|
|
|
import random
|
|
|
|
|
|
|
|
def treq(conn=None):
|
|
|
|
if not conn:
|
2011-08-03 10:38:23 +00:00
|
|
|
conn = flow.ClientConnect(("address", 22))
|
2012-02-19 22:29:36 +00:00
|
|
|
headers = flow.ODictCaseless()
|
2011-03-05 02:58:48 +00:00
|
|
|
headers["header"] = ["qvalue"]
|
2011-08-03 10:38:23 +00:00
|
|
|
return flow.Request(conn, "host", 80, "http", "GET", "/path", headers, "content")
|
2011-03-05 02:58:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
def tresp(req=None):
|
|
|
|
if not req:
|
|
|
|
req = treq()
|
2012-02-19 22:29:36 +00:00
|
|
|
headers = flow.ODictCaseless()
|
2011-03-05 02:58:48 +00:00
|
|
|
headers["header_response"] = ["svalue"]
|
2012-04-02 04:19:00 +00:00
|
|
|
return flow.Response(req, 200, "message", headers, "content_response", None)
|
2011-03-05 02:58:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
def tflow():
|
|
|
|
r = treq()
|
|
|
|
return flow.Flow(r)
|
|
|
|
|
|
|
|
|
|
|
|
def tflow_full():
|
|
|
|
r = treq()
|
|
|
|
f = flow.Flow(r)
|
|
|
|
f.response = tresp(r)
|
|
|
|
return f
|
|
|
|
|
|
|
|
|
2011-05-14 23:22:35 +00:00
|
|
|
def tflow_err():
|
|
|
|
r = treq()
|
|
|
|
f = flow.Flow(r)
|
2011-08-03 10:38:23 +00:00
|
|
|
f.error = flow.Error(r, "error")
|
2011-05-14 23:22:35 +00:00
|
|
|
return f
|
|
|
|
|
|
|
|
|
2011-03-05 02:58:48 +00:00
|
|
|
class TestMaster(controller.Master):
|
|
|
|
def __init__(self, port, testq):
|
2012-02-19 22:04:07 +00:00
|
|
|
s = proxy.ProxyServer(proxy.ProxyConfig("data/testkey.pem"), port)
|
|
|
|
controller.Master.__init__(self, s)
|
2011-03-05 02:58:48 +00:00
|
|
|
self.testq = testq
|
|
|
|
self.log = []
|
|
|
|
|
|
|
|
def clear(self):
|
|
|
|
self.log = []
|
|
|
|
|
|
|
|
def handle(self, m):
|
|
|
|
self.log.append(m)
|
2011-08-03 11:02:33 +00:00
|
|
|
m._ack()
|
2011-03-05 02:58:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
class ProxyThread(threading.Thread):
|
2012-06-07 22:00:16 +00:00
|
|
|
def __init__(self, testq):
|
|
|
|
self.port = random.randint(10000, 20000)
|
|
|
|
self.tmaster = TestMaster(self.port, testq)
|
2011-08-02 04:14:33 +00:00
|
|
|
controller.should_exit = False
|
2011-03-05 02:58:48 +00:00
|
|
|
threading.Thread.__init__(self)
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
self.tmaster.run()
|
|
|
|
|
|
|
|
def shutdown(self):
|
|
|
|
self.tmaster.shutdown()
|
|
|
|
|
|
|
|
|
|
|
|
class ServerThread(threading.Thread):
|
|
|
|
def __init__(self, server):
|
|
|
|
self.server = server
|
|
|
|
threading.Thread.__init__(self)
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
self.server.serve_forever()
|
|
|
|
|
|
|
|
def shutdown(self):
|
|
|
|
self.server.shutdown()
|
|
|
|
|
|
|
|
|
2012-06-07 22:00:16 +00:00
|
|
|
class TestServer(libpry.TestContainer):
|
|
|
|
"""
|
|
|
|
Starts up a Pathod server and a mitmproxy instance.
|
|
|
|
"""
|
|
|
|
def __init__(self, ssl=None):
|
|
|
|
libpry.TestContainer.__init__(self)
|
|
|
|
self.ssl = ssl
|
|
|
|
|
2011-03-05 02:58:48 +00:00
|
|
|
def setUpAll(self):
|
|
|
|
self.tqueue = Queue.Queue()
|
|
|
|
# We don't make any concurrent requests, so we can access
|
|
|
|
# the attributes on this object safely.
|
2012-06-07 22:00:16 +00:00
|
|
|
self.proxy = ProxyThread(self.tqueue)
|
|
|
|
self.server = libpathod.test.Daemon(ssl=self.ssl)
|
|
|
|
self.proxy.start()
|
2011-03-05 02:58:48 +00:00
|
|
|
|
|
|
|
def setUp(self):
|
2012-06-07 22:00:16 +00:00
|
|
|
self.proxy.tmaster.clear()
|
2011-03-05 02:58:48 +00:00
|
|
|
|
|
|
|
def tearDownAll(self):
|
2012-06-07 22:00:16 +00:00
|
|
|
self.proxy.shutdown()
|
|
|
|
self.server.shutdown()
|
2011-03-05 02:58:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
class ProxTest(libpry.AutoTree):
|
2012-06-07 22:00:16 +00:00
|
|
|
def pathod(self, spec):
|
|
|
|
"""
|
|
|
|
Constructs a pathod request, with the appropriate base and proxy.
|
|
|
|
"""
|
|
|
|
return requests.get(self.urlbase + "/p/" + spec, proxies=self.proxies, verify=False)
|
|
|
|
|
|
|
|
@property
|
|
|
|
def proxies(self):
|
|
|
|
"""
|
|
|
|
The URL base for the server instance.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
"http" : "http://127.0.0.1:%s"%self.findAttr("proxy").port,
|
|
|
|
"https" : "http://127.0.0.1:%s"%self.findAttr("proxy").port
|
|
|
|
}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def urlbase(self):
|
|
|
|
"""
|
|
|
|
The URL base for the server instance.
|
|
|
|
"""
|
|
|
|
return self.findAttr("server").urlbase
|
|
|
|
|
2011-03-05 02:58:48 +00:00
|
|
|
def log(self):
|
2012-06-07 22:00:16 +00:00
|
|
|
pthread = self.findAttr("proxy")
|
2011-03-05 02:58:48 +00:00
|
|
|
return pthread.tmaster.log
|
|
|
|
|