mitmproxy/netlib/tservers.py

110 lines
3.1 KiB
Python
Raw Normal View History

2014-08-16 13:53:07 +00:00
from __future__ import (absolute_import, print_function, division)
2016-01-24 22:24:59 +00:00
import threading
2015-09-15 17:12:15 +00:00
from six.moves import queue
from io import StringIO
import OpenSSL
2016-01-24 22:24:59 +00:00
2015-08-10 18:36:47 +00:00
from netlib import tcp
from netlib import tutils
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()
2015-02-27 21:27:23 +00:00
class ServerTestBase(object):
2013-01-25 03:03:59 +00:00
ssl = None
handler = None
addr = ("localhost", 0)
@classmethod
2015-09-20 17:56:57 +00:00
def setup_class(cls):
2015-09-15 17:12:15 +00:00
cls.q = queue.Queue()
s = cls.makeserver()
cls.port = s.address.port
cls.server = ServerThread(s)
cls.server.start()
2013-01-25 03:03:59 +00:00
@classmethod
def makeserver(cls):
return TServer(cls.ssl, cls.q, cls.handler, cls.addr)
2013-01-25 03:03:59 +00:00
@classmethod
2015-09-20 17:56:57 +00:00
def teardown_class(cls):
cls.server.shutdown()
@property
def last_handler(self):
return self.server.server.last_handler
class TServer(tcp.TCPServer):
def __init__(self, ssl, q, handler_klass, addr):
"""
2014-03-07 03:38:50 +00:00
ssl: A dictionary of SSL parameters:
2014-03-07 03:38:50 +00:00
cert, key, request_client_cert, cipher_list,
dhparams, v3_only
"""
tcp.TCPServer.__init__(self, addr)
if ssl is True:
self.ssl = dict()
elif isinstance(ssl, dict):
self.ssl = ssl
else:
self.ssl = None
self.q = q
self.handler_klass = handler_klass
self.last_handler = None
def handle_client_connection(self, request, client_address):
2014-01-28 19:30:16 +00:00
h = self.handler_klass(request, client_address, self)
self.last_handler = h
if self.ssl is not None:
cert = self.ssl.get(
"cert",
tutils.test_data.path("data/server.crt"))
raw_key = self.ssl.get(
"key",
tutils.test_data.path("data/server.key"))
2015-05-30 00:02:58 +00:00
key = OpenSSL.crypto.load_privatekey(
OpenSSL.crypto.FILETYPE_PEM,
2015-06-05 18:52:11 +00:00
open(raw_key, "rb").read())
if self.ssl.get("v3_only", False):
2015-06-22 18:39:30 +00:00
method = OpenSSL.SSL.SSLv3_METHOD
2014-09-28 01:15:26 +00:00
options = OpenSSL.SSL.OP_NO_SSLv2 | OpenSSL.SSL.OP_NO_TLSv1
else:
2015-06-22 18:39:30 +00:00
method = OpenSSL.SSL.SSLv23_METHOD
options = None
h.convert_to_ssl(
cert, key,
method=method,
options=options,
handle_sni=getattr(h, "handle_sni", None),
request_client_cert=self.ssl.get("request_client_cert", None),
cipher_list=self.ssl.get("cipher_list", None),
dhparams=self.ssl.get("dhparams", None),
2015-05-28 15:46:44 +00:00
chain_file=self.ssl.get("chain_file", None),
alpn_select=self.ssl.get("alpn_select", None)
)
h.handle()
h.finish()
2014-09-28 01:15:26 +00:00
def handle_error(self, connection, client_address, fp=None):
2015-09-15 17:12:15 +00:00
s = StringIO()
2014-09-28 01:15:26 +00:00
tcp.TCPServer.handle_error(self, connection, client_address, s)
self.q.put(s.getvalue())