logging.debug("Malformed WebSocket request received")
self._abort()
return
+ # Write the initial headers before attempting to read the challenge.
+ # This is necessary when using proxies (such as HAProxy), which
+ # need to see the Upgrade headers before passing through the
+ # non-HTTP traffic that follows.
+ 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.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()