0

我正在使用 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 mismatch

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

这在我升级到最新的 Safari 之前有效

4

2 回答 2

1

如果客户端在握手(Sec-WebSocket-Protocol)中没有发送任何子协议,那么服务器不能发回子协议头(Sec-WebSocket-Protocol)。如果服务器发回“Sec-WebSocket-Protocol:chat”的通用默认值,即使客户端没有包含子协议标头,客户端也必须拒绝连接。一些浏览器对此很草率,最近开始加强合规性。

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

于 2012-08-21T21:28:29.870 回答
0

好吧,协议是 WebSockets ;-) 有关 Sec-WebSocket-Protocol 的进一步解释,请参阅 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 的协议通常是一场噩梦……可能隐含了一个标准?

于 2012-08-21T20:55:42.247 回答