diff options
author | Edward Hope-Morley <edward.hope-morley@canonical.com> | 2013-09-20 16:34:01 +0100 |
---|---|---|
committer | Edward Hope-Morley <edward.hope-morley@canonical.com> | 2013-10-16 11:24:21 +0100 |
commit | 081046b6cd04fd2cc84488bf5862d31a016fd0ad (patch) | |
tree | c7cff6644512363e9505ce2b2f1da3c40d3dd793 /websockify/websocket.py | |
parent | a61ae52610642ae58e914dda705df8bb9c8213ec (diff) | |
download | websockify-081046b6cd04fd2cc84488bf5862d31a016fd0ad.tar.gz |
Adds optional TCP_KEEPALIVE to WebSocketServer
TCP_KEEPALIVE is now enabled by default. Settings for
KEEPCNT, KEEPINTVL and KEEPIDLE can be supplied when
creating WebSocketServer and KEEPALIVE can also be
disabled if required.
Also adds new unit test for testing.
Co-authored-by: natsume.takashi@lab.ntt.co.jp
Diffstat (limited to 'websockify/websocket.py')
-rw-r--r-- | websockify/websocket.py | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/websockify/websocket.py b/websockify/websocket.py index 2548fb8..14d1422 100644 --- a/websockify/websocket.py +++ b/websockify/websocket.py @@ -58,7 +58,7 @@ for mod, msg in [('numpy', 'HyBi protocol will be slower'), globals()[mod] = __import__(mod) except ImportError: globals()[mod] = None - self.msg("WARNING: no '%s' module, %s", mod, msg) + print("WARNING: no '%s' module, %s" % (mod, msg)) if multiprocessing and sys.platform == 'win32': # make sockets pickle-able/inheritable import multiprocessing.reduction @@ -96,8 +96,11 @@ Sec-WebSocket-Accept: %s\r def __init__(self, listen_host='', listen_port=None, source_is_ipv6=False, verbose=False, cert='', key='', ssl_only=None, - daemon=False, record='', web='', file_only=False, no_parent=False, - run_once=False, timeout=0, idle_timeout=0, traffic=False): + daemon=False, record='', web='', + file_only=False, no_parent=False, + run_once=False, timeout=0, idle_timeout=0, traffic=False, + tcp_keepalive=True, tcp_keepcnt=None, tcp_keepidle=None, + tcp_keepintvl=None): # settings self.verbose = verbose @@ -120,6 +123,10 @@ Sec-WebSocket-Accept: %s\r self.no_parent = no_parent self.logger = self.get_logger() + self.tcp_keepalive = tcp_keepalive + self.tcp_keepcnt = tcp_keepcnt + self.tcp_keepidle = tcp_keepidle + self.tcp_keepintvl = tcp_keepintvl # Make paths settings absolute self.cert = os.path.abspath(cert) @@ -172,7 +179,9 @@ Sec-WebSocket-Accept: %s\r WebSocketServer.__class__.__name__)) @staticmethod - def socket(host, port=None, connect=False, prefer_ipv6=False, unix_socket=None, use_ssl=False): + def socket(host, port=None, connect=False, prefer_ipv6=False, + unix_socket=None, use_ssl=False, tcp_keepalive=True, + tcp_keepcnt=None, tcp_keepidle=None, tcp_keepintvl=None): """ Resolve a host (and optional port) to an IPv4 or IPv6 address. Create a socket. Bind to it if listen is set, otherwise connect to it. Return the socket. @@ -198,6 +207,19 @@ Sec-WebSocket-Accept: %s\r if prefer_ipv6: addrs.reverse() sock = socket.socket(addrs[0][0], addrs[0][1]) + + if tcp_keepalive: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + if tcp_keepcnt: + sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPCNT, + tcp_keepcnt) + if tcp_keepidle: + sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, + tcp_keepidle) + if tcp_keepintvl: + sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, + tcp_keepintvl) + if connect: sock.connect(addrs[0][4]) if use_ssl: @@ -781,7 +803,12 @@ Sec-WebSocket-Accept: %s\r is a WebSockets client then call new_client() method (which must be overridden) for each new client connection. """ - lsock = self.socket(self.listen_host, self.listen_port, False, self.prefer_ipv6) + lsock = self.socket(self.listen_host, self.listen_port, False, + self.prefer_ipv6, + tcp_keepalive=self.tcp_keepalive, + tcp_keepcnt=self.tcp_keepcnt, + tcp_keepidle=self.tcp_keepidle, + tcp_keepintvl=self.tcp_keepintvl) if self.daemon: self.daemonize(keepfd=lsock.fileno(), chdir=self.web) |