WebSockets:让Safari使用pywebsockets Apache扩展



我试图在pywebsocket的帮助下在Apache服务器上运行WebSocket。服务器现在设置好了,我可以通过Chrome浏览器进行Websocket连接。然而,当我试图通过Safari建立连接时,我得到一个"意外响应代码:404",并且似乎没有WebSocket连接能够与服务器建立。

这里的任何指示将是感激的。下面是我调用的客户端JS代码,以建立连接和safari头标签vs Chrome头标签。

    function connect() {
        if ('WebSocket' in window) {
            socket = new WebSocket("ws://localhost/mystream");
        } else if ('MozWebSocket' in window) {
            socket = new MozWebSocket("ws://localhost/mystream");
        } else {
            return;
        }
    socket.onopen = function () {
        showResult('Opened');
    };
    socket.onmessage = function (event) {
        showResult(event.data);
    };
    socket.onerror = function () {
        showResult('Error in connection');
    };
    socket.onclose = function (event) {
        var logMessage = 'Closed (';
        if ((arguments.length == 1) && ('CloseEvent' in window) && (event instanceof CloseEvent)) {
            logMessage += 'wasClean = ' + event.wasClean;
            if ('code' in event) {
                logMessage += ', code = ' + event.code;
            }
            if ('reason' in event) {
                logMessage += ', reason = ' + event.reason;
            }
        } else {
            logMessage += 'CloseEvent is not available';
        }
        showResult(logMessage + ')');
  };
  showResult('Successfully Connected ');
}

Safari Headers:

Origin: http://192.168.1.8
Sec-WebSocket-Key1: 26 ~ 5 75G3 36< 0 U8T
Connection: Upgrade
Host: localhost
Sec-WebSocket-Key2: 1<A   9 4 4l865P5/6L5
Upgrade: WebSocket

Chrome Headers:

Connection:Upgrade
Host:localhost
Origin:http://192.168.1.8
Sec-WebSocket-Key:IAkX9XGWsCZHPQepzYjwxA==
Sec-WebSocket-Version:13
Upgrade:websocket
(Key3):00:00:00:00:00:00:00:00

已经修好了。Safari(5.1)和移动Safari都需要Hixie-75标志,它在pywebsockets中具有实验性支持。问题是apache配置文件中的条目,该条目应该是小写的(即上),但样本条目在CamelCase中(上)。

更新

这些Safari标头适用于协议的旧版本:Hixie-76。Hixie-76对于与web服务器的集成不太友好,因为在报头之后发送了特殊数据(key3)。我猜想在下一个或两个版本中,Safari将更新到该协议的新版本(HyBi)。

HyBi-76握手发生在handshake/hybi00.py中,您可以尝试添加一些调试来尝试找出失败的地方。特别是要确保_get_challenge实际上获得了在报头之后发送的挑战的最后8字节(key3)(这是使在web服务器中处理Hixie-76变得复杂的部分)。

相关内容

  • 没有找到相关文章