Add ping heartbeat option
With this option we will ping the client with a heartbeat. Helpful for connection through firewalls that may disable inactive connections.
This commit is contained in:
parent
731fd20796
commit
52adf957b3
|
|
@ -370,6 +370,10 @@ class WebSocketRequestHandler(SimpleHTTPRequestHandler):
|
||||||
repr(frame['payload']))
|
repr(frame['payload']))
|
||||||
self.send_pong(frame['payload'])
|
self.send_pong(frame['payload'])
|
||||||
return [], False
|
return [], False
|
||||||
|
elif frame['opcode'] == 0xA: # pong
|
||||||
|
self.print_traffic("} pong %s\n" %
|
||||||
|
repr(frame['payload']))
|
||||||
|
return [], False
|
||||||
|
|
||||||
self.print_traffic("}")
|
self.print_traffic("}")
|
||||||
|
|
||||||
|
|
@ -407,6 +411,11 @@ class WebSocketRequestHandler(SimpleHTTPRequestHandler):
|
||||||
buf, h, t = self.encode_hybi(s2b(data), opcode=0x0A, base64=False)
|
buf, h, t = self.encode_hybi(s2b(data), opcode=0x0A, base64=False)
|
||||||
self.request.send(buf)
|
self.request.send(buf)
|
||||||
|
|
||||||
|
def send_ping(self, data=''):
|
||||||
|
""" Send a WebSocket ping frame. """
|
||||||
|
buf, h, t = self.encode_hybi(s2b(data), opcode=0x09, base64=False)
|
||||||
|
self.request.send(buf)
|
||||||
|
|
||||||
def do_websocket_handshake(self):
|
def do_websocket_handshake(self):
|
||||||
h = self.headers
|
h = self.headers
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -111,9 +111,21 @@ Traffic Legend:
|
||||||
tqueue = []
|
tqueue = []
|
||||||
rlist = [self.request, target]
|
rlist = [self.request, target]
|
||||||
|
|
||||||
|
if self.server.heartbeat:
|
||||||
|
now = time.time()
|
||||||
|
self.heartbeat = now + self.server.heartbeat
|
||||||
|
else:
|
||||||
|
self.heartbeat = None
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
wlist = []
|
wlist = []
|
||||||
|
|
||||||
|
if self.heartbeat is not None:
|
||||||
|
now = time.time()
|
||||||
|
if now > self.heartbeat:
|
||||||
|
self.heartbeat = now + self.server.heartbeat
|
||||||
|
self.send_ping()
|
||||||
|
|
||||||
if tqueue: wlist.append(target)
|
if tqueue: wlist.append(target)
|
||||||
if cqueue or c_pend: wlist.append(self.request)
|
if cqueue or c_pend: wlist.append(self.request)
|
||||||
ins, outs, excepts = select(rlist, wlist, [], 1)
|
ins, outs, excepts = select(rlist, wlist, [], 1)
|
||||||
|
|
@ -180,6 +192,7 @@ class WebSocketProxy(websocket.WebSocketServer):
|
||||||
self.wrap_mode = kwargs.pop('wrap_mode', None)
|
self.wrap_mode = kwargs.pop('wrap_mode', None)
|
||||||
self.unix_target = kwargs.pop('unix_target', None)
|
self.unix_target = kwargs.pop('unix_target', None)
|
||||||
self.ssl_target = kwargs.pop('ssl_target', None)
|
self.ssl_target = kwargs.pop('ssl_target', None)
|
||||||
|
self.heartbeat = kwargs.pop('heartbeat', None)
|
||||||
|
|
||||||
token_plugin = kwargs.pop('token_plugin', None)
|
token_plugin = kwargs.pop('token_plugin', None)
|
||||||
token_source = kwargs.pop('token_source', None)
|
token_source = kwargs.pop('token_source', None)
|
||||||
|
|
@ -370,6 +383,8 @@ def websockify_init():
|
||||||
"on instantiation")
|
"on instantiation")
|
||||||
parser.add_option("--auto-pong", action="store_true",
|
parser.add_option("--auto-pong", action="store_true",
|
||||||
help="Automatically respond to ping frames with a pong")
|
help="Automatically respond to ping frames with a pong")
|
||||||
|
parser.add_option("--heartbeat", type=int, default=0,
|
||||||
|
help="send a ping to the client every HEARTBEAT seconds")
|
||||||
|
|
||||||
(opts, args) = parser.parse_args()
|
(opts, args) = parser.parse_args()
|
||||||
|
|
||||||
|
|
@ -456,6 +471,7 @@ class LibProxyServer(ForkingMixIn, HTTPServer):
|
||||||
self.ssl_target = kwargs.pop('ssl_target', None)
|
self.ssl_target = kwargs.pop('ssl_target', None)
|
||||||
self.token_plugin = kwargs.pop('token_plugin', None)
|
self.token_plugin = kwargs.pop('token_plugin', None)
|
||||||
self.token_source = kwargs.pop('token_source', None)
|
self.token_source = kwargs.pop('token_source', None)
|
||||||
|
self.heartbeat = kwargs.pop('heartbeat', None)
|
||||||
|
|
||||||
self.token_plugin = None
|
self.token_plugin = None
|
||||||
self.daemon = False
|
self.daemon = False
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue