aboutsummaryrefslogtreecommitdiff
path: root/dummyserver/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'dummyserver/server.py')
-rwxr-xr-xdummyserver/server.py50
1 files changed, 32 insertions, 18 deletions
diff --git a/dummyserver/server.py b/dummyserver/server.py
index 9031664..f4f98a4 100755
--- a/dummyserver/server.py
+++ b/dummyserver/server.py
@@ -11,11 +11,14 @@ import sys
import threading
import socket
+from tornado import netutil
import tornado.wsgi
import tornado.httpserver
import tornado.ioloop
+import tornado.web
from dummyserver.handlers import TestingApp
+from dummyserver.proxy import ProxyHandler
log = logging.getLogger(__name__)
@@ -36,28 +39,29 @@ 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
+ :param ready_event: Event which gets set when the socket handler is
ready to receive requests.
"""
def __init__(self, socket_handler, host='localhost', port=8081,
- ready_lock=None):
+ ready_event=None):
threading.Thread.__init__(self)
self.socket_handler = socket_handler
self.host = host
- self.port = port
- self.ready_lock = ready_lock
+ self.ready_event = ready_event
def _start_server(self):
sock = socket.socket()
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- sock.bind((self.host, self.port))
+ if sys.platform != 'win32':
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ sock.bind((self.host, 0))
+ self.port = sock.getsockname()[1]
# Once listen() returns, the server socket is ready
sock.listen(1)
- if self.ready_lock:
- self.ready_lock.release()
+ if self.ready_event:
+ self.ready_event.set()
self.socket_handler(sock)
sock.close()
@@ -67,34 +71,44 @@ class SocketServerThread(threading.Thread):
class TornadoServerThread(threading.Thread):
- def __init__(self, host='localhost', port=8081, scheme='http', certs=None):
+ app = tornado.wsgi.WSGIContainer(TestingApp())
+
+ def __init__(self, host='localhost', scheme='http', certs=None,
+ ready_event=None):
threading.Thread.__init__(self)
self.host = host
- self.port = port
self.scheme = scheme
self.certs = certs
+ self.ready_event = ready_event
def _start_server(self):
- container = tornado.wsgi.WSGIContainer(TestingApp())
-
if self.scheme == 'https':
- http_server = tornado.httpserver.HTTPServer(container,
+ http_server = tornado.httpserver.HTTPServer(self.app,
ssl_options=self.certs)
else:
- http_server = tornado.httpserver.HTTPServer(container)
+ http_server = tornado.httpserver.HTTPServer(self.app)
- http_server.listen(self.port, address=self.host)
+ family = socket.AF_INET6 if ':' in self.host else socket.AF_INET
+ sock, = netutil.bind_sockets(None, address=self.host, family=family)
+ self.port = sock.getsockname()[1]
+ http_server.add_sockets([sock])
return http_server
def run(self):
- self.server = self._start_server()
self.ioloop = tornado.ioloop.IOLoop.instance()
+ self.server = self._start_server()
+ if self.ready_event:
+ self.ready_event.set()
self.ioloop.start()
def stop(self):
- self.server.stop()
- self.ioloop.stop()
+ self.ioloop.add_callback(self.server.stop)
+ self.ioloop.add_callback(self.ioloop.stop)
+
+
+class ProxyServerThread(TornadoServerThread):
+ app = tornado.web.Application([(r'.*', ProxyHandler)])
if __name__ == '__main__':