我有压缩这个问题,我不确定它是不是一个bug。我的WebSocket服务器不支持上下文接管,我在发送消息时遇到问题,但没有收到。
浏览器会发出如下请求:
GET /socket HTTP/1.1
Host: thirdparty.com
Origin: http://example.com
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
如果服务器未指定有关上下文接管的任何选项:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Access-Control-Allow-Origin: http://example.com
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Extensions: permessage-deflate
我可以读取和写入第一条消息,但不能进行后续的读取或写入,因为Chrome希望服务器保留上下文。
所以我的服务器提供了这个答案:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Access-Control-Allow-Origin: http://example.com
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Extensions: permessage-deflate; client_no_context_takeover; server_no_context_takeover
现在我可以毫无问题地接收消息了,但同样,我只能发送第一条消息,第二条消息失败,我在Chrome中看到一条错误,说它在充气框架时失败了。我试图发送两个相同的字符串,我可以看到服务器如何发送两次相同的数据,但客户端第二次无法解压缩它。
因此,Chrome似乎接受client_no_context_takeover
参数,该参数指定客户端在压缩时不会对所有邮件使用相同的压缩上下文,但忽略server_no_context_takeover
表示服务器不会使用相同的背景。
这是Chrome中的错误吗?我不清楚我是否可以发回未经客户提供/要求的选项。
我可以使用其他任何选项来禁用客户端上下文接管吗?
更新
在Chromium source代码的 WebSocketPerMessageDeflate.cpp 中,我可以看到:
if (clientNoContextTakeover != parameters.end()) {
if (!clientNoContextTakeover->value.isNull()) {
m_failureReason = "Received invalid client_no_context_takeover parameter";
return false;
}
mode = WebSocketDeflater::DoNotTakeOverContext;
++numProcessedParameters;
}
但是:
if (serverNoContextTakeover != parameters.end()) {
if (!serverNoContextTakeover->value.isNull()) {
m_failureReason = "Received invalid server_no_context_takeover parameter";
return false;
}
++numProcessedParameters;
}
在第一个片段中,它设置了“mode”变量,但在第二个片段中没有做任何事情,所以它似乎基本上忽略了参数。
干杯。
答案 0 :(得分:1)
仅当客户端请求“无上下文接管”时,服务器才必须在响应中发送server_no_context_takeover
参数。实质上,服务器确认客户端的请求。
如果服务器决定进行“无上下文接管”以便自己发送(没有客户端请求它),那很好。在这种情况下,服务器不会发送任何参数。
deflate发送者可以始终使用它自己的drop compression上下文和/或减少压缩窗口大小。没有必要告诉接收者。放气线格式有足够的信息供接收者应对。
Here是配置和握手在Crossbar.io中的外观。
答案 1 :(得分:0)
我终于找到了问题。
http://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-17#section-8.2.3
8.2.3.4。使用带有BFINAL的DEFLATE块设置为1
通过草案中的示例,我发现我的服务器发送的负载略有不同。原来问题是BFINAL,我需要通过在末尾添加一个0字节将其设置为0.
现在可行。