From: Ben Darnell Date: Sun, 26 Mar 2017 17:41:36 +0000 (-0400) Subject: Merge branch 'master' into master X-Git-Tag: v4.5.0~12^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F1917%2Fhead;p=thirdparty%2Ftornado.git Merge branch 'master' into master --- 71a8d194e7be8655c04d6083ac650da182879081 diff --cc tornado/test/websocket_test.py index 8de1b95af,2de221134..0875e4b91 --- a/tornado/test/websocket_test.py +++ b/tornado/test/websocket_test.py @@@ -1,6 -1,6 +1,7 @@@ - from __future__ import absolute_import, division, print_function, with_statement + from __future__ import absolute_import, division, print_function +import functools + import sys import traceback from tornado.concurrent import Future diff --cc tornado/websocket.py index f44ff5ad4,d30aead8a..1fafed777 --- a/tornado/websocket.py +++ b/tornado/websocket.py @@@ -184,10 -183,30 +184,28 @@@ class WebSocketHandler(tornado.web.Requ if self.ws_connection: self.ws_connection.accept_connection() else: - if not self.stream.closed(): - self.stream.write(tornado.escape.utf8( - "HTTP/1.1 426 Upgrade Required\r\n" - "Sec-WebSocket-Version: 7, 8, 13\r\n\r\n")) - self.stream.close() + self.set_status(426, "Upgrade Required") + self.set_header("Sec-WebSocket-Version", "7, 8, 13") + self.finish() + stream = None + + @property + def ping_interval(self): + """The interval for websocket keep-alive pings. + + Set ws_ping_interval = 0 to disable pings. + """ + return self.settings.get('websocket_ping_interval', None) + + @property + def ping_timeout(self): + """If no ping is received in this many seconds, + close the websocket connection (VPNs, etc. can fail to cleanly close ws connections). + Default is max of 3 pings or 30 seconds. + """ + return self.settings.get('websocket_ping_timeout', None) + def write_message(self, message, binary=False): """Sends the given message to the client of this Web Socket. @@@ -582,21 -641,24 +638,22 @@@ class WebSocketProtocol13(WebSocketProt # Don't echo an offered client_max_window_bits # parameter with no value. del ext[1]['client_max_window_bits'] - extension_header = ('Sec-WebSocket-Extensions: %s\r\n' % - httputil._encode_header( - 'permessage-deflate', ext[1])) + self.handler.set_header("Sec-WebSocket-Extensions", + httputil._encode_header( + 'permessage-deflate', ext[1])) break - if self.stream.closed(): - self._abort() - return - self.stream.write(tornado.escape.utf8( - "HTTP/1.1 101 Switching Protocols\r\n" - "Upgrade: websocket\r\n" - "Connection: Upgrade\r\n" - "Sec-WebSocket-Accept: %s\r\n" - "%s%s" - "\r\n" % (self._challenge_response(), - subprotocol_header, extension_header))) + self.handler.clear_header("Content-Type") + self.handler.set_status(101) + self.handler.set_header("Upgrade", "websocket") + self.handler.set_header("Connection", "Upgrade") + self.handler.set_header("Sec-WebSocket-Accept", self._challenge_response()) + self.handler.finish() + + self.handler._attach_stream() + self.stream = self.handler.stream + self.start_pinging() self._run_callback(self.handler.open, *self.handler.open_args, **self.handler.open_kwargs) self._receive_frame()