logging.debug("Malformed WebSocket request received")
self._abort()
return
+ self.stream.write(
+ "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: Upgrade\r\n"
+ "Server: TornadoServer/%(version)s\r\n"
+ "Sec-WebSocket-Origin: %(origin)s\r\n"
+ "Sec-WebSocket-Location: ws://%(host)s%(path)s\r\n\r\n" % (dict(
+ version=tornado.version,
+ origin=self.request.headers["Origin"],
+ host=self.request.host,
+ path=self.request.path)),
+ self._do_handle_challenge)
+
+ def _do_handle_challenge(self):
+ """
+ This is called after we write the first part of the header, but
+ before we write the challenge response.
+ Allows an intermediary like HAProxy to use standard http by
+ writing the 101 response before acquiring the nonce for challenge.
+ """
self.stream.read_bytes(8, self._handle_challenge)
def _handle_challenge(self, challenge):
self._write_response(challenge_response)
def _write_response(self, challenge):
- self.stream.write(
- "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
- "Upgrade: WebSocket\r\n"
- "Connection: Upgrade\r\n"
- "Server: TornadoServer/%(version)s\r\n"
- "Sec-WebSocket-Origin: %(origin)s\r\n"
- "Sec-WebSocket-Location: ws://%(host)s%(path)s\r\n"
- "\r\n%(challenge)s" % (dict(
- version=tornado.version,
- origin=self.request.headers["Origin"],
- host=self.request.host,
- path=self.request.path,
- challenge=challenge)))
+ self.stream.write("%s" % challenge)
self.async_callback(self.open)(*self.open_args, **self.open_kwargs)
self._receive_message()