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.
# 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()