aboutsummaryrefslogtreecommitdiff
path: root/dummyserver/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'dummyserver/server.py')
-rwxr-xr-xdummyserver/server.py113
1 files changed, 113 insertions, 0 deletions
diff --git a/dummyserver/server.py b/dummyserver/server.py
new file mode 100755
index 0000000..529850f
--- /dev/null
+++ b/dummyserver/server.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+
+"""
+Dummy server used for unit testing.
+"""
+from __future__ import print_function
+
+import logging
+import os
+import sys
+import threading
+import socket
+
+import tornado.wsgi
+import tornado.httpserver
+import tornado.ioloop
+
+from dummyserver.handlers import TestingApp
+
+
+log = logging.getLogger(__name__)
+
+CERTS_PATH = os.path.join(os.path.dirname(__file__), 'certs')
+DEFAULT_CERTS = {
+ 'certfile': os.path.join(CERTS_PATH, 'server.crt'),
+ 'keyfile': os.path.join(CERTS_PATH, 'server.key'),
+}
+DEFAULT_CA = os.path.join(CERTS_PATH, 'cacert.pem')
+DEFAULT_CA_BAD = os.path.join(CERTS_PATH, 'client_bad.pem')
+
+
+# Different types of servers we have:
+
+
+class SocketServerThread(threading.Thread):
+ """
+ :param socket_handler: Callable which receives a socket argument for one
+ request.
+ :param ready_lock: Lock which gets released when the socket handler is
+ ready to receive requests.
+ """
+ def __init__(self, socket_handler, host='localhost', port=8081,
+ ready_lock=None):
+ threading.Thread.__init__(self)
+
+ self.socket_handler = socket_handler
+ self.host = host
+ self.port = port
+ self.ready_lock = ready_lock
+
+ def _start_server(self):
+ sock = socket.socket()
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ sock.bind((self.host, self.port))
+
+ # Once listen() returns, the server socket is ready
+ sock.listen(1)
+
+ if self.ready_lock:
+ self.ready_lock.release()
+
+ self.socket_handler(sock)
+
+ def run(self):
+ self.server = self._start_server()
+
+
+class TornadoServerThread(threading.Thread):
+ def __init__(self, host='localhost', port=8081, scheme='http', certs=None):
+ threading.Thread.__init__(self)
+
+ self.host = host
+ self.port = port
+ self.scheme = scheme
+ self.certs = certs
+
+ def _start_server(self):
+ container = tornado.wsgi.WSGIContainer(TestingApp())
+
+ if self.scheme == 'https':
+ http_server = tornado.httpserver.HTTPServer(container,
+ ssl_options=self.certs)
+ else:
+ http_server = tornado.httpserver.HTTPServer(container)
+
+ http_server.listen(self.port)
+ return http_server
+
+ def run(self):
+ self.server = self._start_server()
+ self.ioloop = tornado.ioloop.IOLoop.instance()
+ self.ioloop.start()
+
+ def stop(self):
+ self.server.stop()
+ self.ioloop.stop()
+
+
+if __name__ == '__main__':
+ log.setLevel(logging.DEBUG)
+ log.addHandler(logging.StreamHandler(sys.stderr))
+
+ from urllib3 import get_host
+
+ url = "http://localhost:8081"
+ if len(sys.argv) > 1:
+ url = sys.argv[1]
+
+ print("Starting WGI server at: %s" % url)
+
+ scheme, host, port = get_host(url)
+ t = TornadoServerThread(scheme=scheme, host=host, port=port)
+ t.start()