Websocket和Safari 6.0

时间:2012-08-21 20:47:56

标签: safari websocket

我正在使用Safari 6和websockets。我的服务器从浏览器接收以下握手:

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: nomad.local:1299
Origin: file://
Sec-WebSocket-Key: WhZTuybN4i2ZshDBxco42w==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

没有包含任何议定书。我的服务器可以处理它,但当它尝试完成与浏览器客户端的握手时,我收到以下消息: WebSocket握手期间出错:Sec-WebSocket-Protocol不匹配

在发送给服务器的消息中是否存在隐含的协议,我需要在握手时返回给客户端?

这在我升级到最新的Safari

之前有效

2 个答案:

答案 0 :(得分:0)

协议是WebSockets ;-)有关Sec-WebSocket协议的进一步说明,请参阅RFC:http://datatracker.ietf.org/doc/rfc6455/?include_text=1

来自客户端的握手如下所示:

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Origin: http://example.com
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13

来自服务器的握手如下所示:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
    Sec-WebSocket-Protocol: chat

不知道Safari 6的实现有何不同,但RFC的协议通常是一场噩梦......可能有一个隐含的标准?

答案 1 :(得分:0)

如果客户端未在握手中发送任何子协议(Sec-WebSocket-Protocol),则服务器不得发回子协议头(Sec-WebSocket-Protocol)。如果服务器发回公共默认值“Sec-WebSocket-Protocol:chat”,即使客户端不包含子协议头,客户端也必须拒绝连接。一些浏览器对此很草率,最近开始收紧合规。

如果客户端确实发送了子协议列表,那么服务器必须选择它支持的单个子协议,并将其作为所选的子协议发送回客户端。