Add TCP socket servers
Project: http://git-wip-us.apache.org/repos/asf/trafficserver-qa/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver-qa/commit/498fdda5 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver-qa/tree/498fdda5 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver-qa/diff/498fdda5 Branch: refs/heads/master Commit: 498fdda5b3155d8d9a7c7d2d9c850d22826d942b Parents: 1ceb438 Author: Thomas Jackson <[email protected]> Authored: Wed Jan 21 18:54:50 2015 -0800 Committer: Thomas Jackson <[email protected]> Committed: Wed Jan 21 18:54:50 2015 -0800 ---------------------------------------------------------------------- tsqa/endpoint.py | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver-qa/blob/498fdda5/tsqa/endpoint.py ---------------------------------------------------------------------- diff --git a/tsqa/endpoint.py b/tsqa/endpoint.py index 1d18325..80ff841 100644 --- a/tsqa/endpoint.py +++ b/tsqa/endpoint.py @@ -4,7 +4,8 @@ import os import threading import requests import flask - +import SocketServer +import ssl from collections import defaultdict from wsgiref.simple_server import make_server @@ -153,3 +154,87 @@ class DynamicHTTPEndpoint(threading.Thread): self.ready.set() # serve it self.server.serve_forever() + + +class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): + pass + + +class SocketServerDaemon(threading.Thread): + ''' + A daemon thread to run a socketserver + ''' + def __init__(self, handler, port=0): + threading.Thread.__init__(self) + self.port = port + self.handler = handler + self.ready = threading.Event() + self.daemon = True + + def run(self): + self.server = ThreadedTCPServer(('0.0.0.0', self.port), self.handler) + self.server.allow_reuse_address = True + self.port = self.server.socket.getsockname()[1] + + self.ready.set() + + # Activate the server; this will keep running until you + # interrupt the program with Ctrl-C + self.server.serve_forever() + + +class ThreadedSSLTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): + def __init__(self, + server_address, + RequestHandlerClass, + certfile, + keyfile, + ssl_version=ssl.PROTOCOL_TLSv1, + bind_and_activate=True): + SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate) + self.certfile = certfile + self.keyfile = keyfile + self.ssl_version = ssl_version + + def get_request(self): + newsocket, fromaddr = self.socket.accept() + connstream = ssl.wrap_socket(newsocket, + server_side=True, + certfile=self.certfile, + keyfile=self.keyfile, + ssl_version=self.ssl_version, + ) + return connstream, fromaddr + +class SSLSocketServerDaemon(threading.Thread): + ''' + A daemon thread to run a socketserver + ''' + def __init__(self, handler, cert, key, port=0): + # TODO: nicer import? + import requests + requests.packages.urllib3.disable_warnings() + + threading.Thread.__init__(self) + self.handler = handler + self.cert = cert + self.key = key + self.port = port + + self.ready = threading.Event() + self.daemon = True + + def run(self): + self.server = ThreadedSSLTCPServer(('0.0.0.0', self.port), + self.handler, + self.cert, + self.key, + ) + self.server.allow_reuse_address = True + self.port = self.server.socket.getsockname()[1] + + self.ready.set() + + # Activate the server; this will keep running until you + # interrupt the program with Ctrl-C + self.server.serve_forever()
