From 9348dd5208fcd91e11237c1884074ff8949fe025 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Fri, 31 Aug 2012 09:24:09 -0500 Subject: [PATCH 1/2] Implement option --idle-timeout server exits after TIMEOUT seconds if there are no active connections --- websocket.py | 13 ++++++++++++- websockify | 3 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/websocket.py b/websocket.py index 11f718c..cbca3bb 100644 --- a/websocket.py +++ b/websocket.py @@ -101,7 +101,7 @@ 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='', - run_once=False, timeout=0): + run_once=False, timeout=0, idle_timeout=0): # settings self.verbose = verbose @@ -112,6 +112,7 @@ Sec-WebSocket-Accept: %s\r self.daemon = daemon self.run_once = run_once self.timeout = timeout + self.idle_timeout = idle_timeout self.launch_time = time.time() self.ws_connection = False @@ -837,6 +838,10 @@ Sec-WebSocket-Accept: %s\r self.client = None startsock = None pid = err = 0 + child_count = 0 + + if multiprocessing and self.idle_timeout: + child_count = len(multiprocessing.active_children()) time_elapsed = time.time() - self.launch_time if self.timeout and time_elapsed > self.timeout: @@ -844,6 +849,12 @@ Sec-WebSocket-Accept: %s\r % self.timeout) break + if self.idle_timeout and time_elapsed > self.idle_timeout \ + and child_count == 0: + self.msg('listener exit due to --idle-timeout %s' + % self.idle_timeout) + break + try: self.poll() diff --git a/websockify b/websockify index 965ce13..13f6582 100755 --- a/websockify +++ b/websockify @@ -308,6 +308,9 @@ def websockify_init(): help="handle a single WebSocket connection and exit") parser.add_option("--timeout", type=int, default=0, help="after TIMEOUT seconds exit when not connected") + parser.add_option("--idle-timeout", type=int, default=0, + help="server exits after TIMEOUT seconds if there are no " + "active connections") parser.add_option("--cert", default="self.pem", help="SSL certificate file") parser.add_option("--key", default=None, From 82cb31f3b68a8cada4c2f46b97b5c6c85c9d5994 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Fri, 31 Aug 2012 10:55:24 -0500 Subject: [PATCH 2/2] change --idle-timeout to reset the idle timeout when active --- websocket.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/websocket.py b/websocket.py index cbca3bb..4c0cacc 100644 --- a/websocket.py +++ b/websocket.py @@ -832,6 +832,7 @@ Sec-WebSocket-Accept: %s\r # os.fork() (python 2.4) child reaper signal.signal(signal.SIGCHLD, self.fallback_SIGCHLD) + last_active_time = self.launch_time while True: try: try: @@ -849,11 +850,18 @@ Sec-WebSocket-Accept: %s\r % self.timeout) break - if self.idle_timeout and time_elapsed > self.idle_timeout \ - and child_count == 0: - self.msg('listener exit due to --idle-timeout %s' - % self.idle_timeout) - break + if self.idle_timeout: + idle_time = 0 + if child_count == 0: + idle_time = time.time() - last_active_time + else: + idle_time = 0 + last_active_time = time.time() + + if idle_time > self.idle_timeout and child_count == 0: + self.msg('listener exit due to --idle-timeout %s' + % self.idle_timeout) + break try: self.poll()