我正在使用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
之前有效答案 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”,即使客户端不包含子协议头,客户端也必须拒绝连接。一些浏览器对此很草率,最近开始收紧合规。
如果客户端确实发送了子协议列表,那么服务器必须选择它支持的单个子协议,并将其作为所选的子协议发送回客户端。