From: Ben Darnell Date: Wed, 13 Oct 2010 21:58:49 +0000 (-0700) Subject: Support websockets over HTTP proxies. X-Git-Tag: v1.2.0~102 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86bd681ff841f272c5205f24cd2a613535ed2e00;p=thirdparty%2Ftornado.git Support websockets over HTTP proxies. Adapted from http://github.com/cbecker333/tornado/commit/ce02250ed3579706f800cfc5e622da834d79f933 --- diff --git a/tornado/websocket.py b/tornado/websocket.py index b760fef6b..7206e5da8 100644 --- a/tornado/websocket.py +++ b/tornado/websocket.py @@ -81,6 +81,21 @@ class WebSocketHandler(tornado.web.RequestHandler): 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): @@ -93,19 +108,7 @@ class WebSocketHandler(tornado.web.RequestHandler): 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()