]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Support websockets over HTTP proxies.
authorBen Darnell <ben@bendarnell.com>
Wed, 13 Oct 2010 21:58:49 +0000 (14:58 -0700)
committerBen Darnell <ben@bendarnell.com>
Wed, 13 Oct 2010 21:58:49 +0000 (14:58 -0700)
Adapted from
http://github.com/cbecker333/tornado/commit/ce02250ed3579706f800cfc5e622da834d79f933

tornado/websocket.py

index b760fef6b5427bfdcf34ef564d4e92315553befa..7206e5da83705451ee76a58b69c3e1506b8c8c4f 100644 (file)
@@ -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()