6

我有一个与 Firefox 和 Chrome 18 完美配合的 websocket 客户端/服务器。它不适用于 Chrome 19 beta。我怀疑这是由于这个浏览器现在使用了我的服务器不支持的 deflate-frame 扩展。

Chrome 19 beta 在其握手中发送:“Sec-WebSocket-Extensions: x-webkit-deflate-frame”

我让我的服务器发回:“Sec-WebSocket-Extensions:”

但要么这不是拒绝扩展的正确方法,要么我没有发现其他错误。这是握手中唯一与我从工作浏览器中看到的不同的东西。

编辑:这是一些附加信息。这些是 Wireshark 捕获的握手。


使用 Firefox 12 的握手:

GET /chatserver HTTP/1.1
主机:(本文省略)
用户代理:Mozilla/5.0(Windows NT 6.1;WOW64;rv:12.0) Gecko/20100101 Firefox/12.0
接受:text/html,application/xhtml+xml, application/xml;q=0.9, / ;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive, Upgrade
Sec-WebSocket-Version: 13
来源:(本文省略)
Sec-WebSocket-Key:2TKm4ozUQdNP17Lobt7IBg==
Pragma:no-cache
Cache-Control:no-cache
升级:websocket

HTTP/1.1 101 切换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept:pSUB3BT9YUUd9n3mOeWY/1uVqJE=


使用 Chrome 18 的握手:

GET /chatserver HTTP/1.1
升级:websocket
连接:升级
主机:(本文省略)
来源:(本文省略)
Sec-WebSocket-Key:zuHLEC8pGvAMadarhCLXFA==
Sec-WebSocket-Version:13

HTTP/1.1 101 切换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept:LMBSq6Bk9Kiv+zAbQlAL899pfzc=


使用 Chrome 19 的握手:

GET /chatserver HTTP/1.1
升级:websocket
连接:升级
主机:(本文省略)
来源:(本文省略)
Sec-WebSocket-Key:TbwnVcuUiqGgZn7hxvxzvQ==
Sec-WebSocket-Version:13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

HTTP/1.1 101 切换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept:D45BJ+Vfydy1Upcs3Hze/nuiaS8=
Sec-WebSocket-Extensions:


所有服务器响应都有 \r\n 行结尾,并在消息末尾包含一个额外的 \r\n。

FF12 和 Chrome18 工作 - Chrome19 不工作。在 Chrome19 中,服务器握手响应之后的下一个数据包是 FIN/ACK。连接已关闭。

注意。我也尝试使用连字符作为 Sec-WebSocket-Extensions 值,但这也不起作用。

4

2 回答 2

4

发现了问题。

首先,服务器响应中的空白 Sec-WebSocket-Extensions 条目产生了“ Invalid UTF-8 sequence in header value”错误。删除该条目后,剩余的错误是“ A server must not mask any frames that it sends to the client.

事实上,我的服务器实现(PHPWebSocket 的高度修改版本)默认屏蔽它发送的帧。更改此默认行为解决了问题,并且 websocket 连接现在可以在 Chrome 19 中使用。

将 PHPWebSocket 标记添加到此问题,因为这是该项目的问题。

于 2012-05-06T06:07:45.763 回答
2

对于 Chrome,“Sec-WebSocket-Protocol”标头必须对服务器端和客户端都具有价值。对我来说就是这种情况。

于 2013-11-19T11:15:20.657 回答