首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有上下文接管的Chrome中的WebSocket permessage

没有上下文接管的Chrome中的WebSocket permessage
EN

Stack Overflow用户
提问于 2014-03-04 10:17:18
回答 2查看 11.4K关注 0票数 0

我在压缩方面有这个问题,我不确定它是否是一个bug。我的WebSocket服务器不支持上下文接管,我在发送消息时遇到问题,但无法接收消息。

浏览器发出如下请求:

代码语言:javascript
复制
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

如果服务器没有指定任何关于上下文接管的选项:

代码语言:javascript
复制
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希望服务器保持上下文。

因此,我的服务器提供了以下答案:

代码语言:javascript
复制
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的错误吗?我不清楚我是否可以将未被客户提供/请求的选项发回。

是否还有其他选项可用于禁用客户端上下文接管?

更新:

WebSocketPerMessageDeflate.cpp中的铬源代码中,我可以看到:

代码语言:javascript
复制
if (clientNoContextTakeover != parameters.end()) {
    if (!clientNoContextTakeover->value.isNull()) {
        m_failureReason = "Received invalid client_no_context_takeover parameter";
        return false;
    }
    mode = WebSocketDeflater::DoNotTakeOverContext;
    ++numProcessedParameters;
}

但也包括:

代码语言:javascript
复制
if (serverNoContextTakeover != parameters.end()) {
    if (!serverNoContextTakeover->value.isNull()) {
        m_failureReason = "Received invalid server_no_context_takeover parameter";
        return false;
    }
    ++numProcessedParameters;
}

在第一个片段中,它正在设置"mode“变量,而在第二个片段中,它并不是什么都不做,因此它似乎基本上忽略了参数。

干杯。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-07 10:20:01

我终于发现了问题。

https://datatracker.ietf.org/doc/html/draft-ietf-hybi-permessage-compression-17#section-8.2.3

8.2.3.4.使用BFINAL设置为1的泄气块

通过查看草案中的示例,我发现我的服务器发送的负载略有不同。结果发现问题是BFINAL,我需要将其设置为0,在末尾添加一个0字节。

现在起作用了。

票数 0
EN

Stack Overflow用户

发布于 2014-03-04 14:36:54

只有当客户端请求“无上下文接管”时,服务器才必须在响应中发送server_no_context_takeover参数。本质上,服务器确认客户端的请求。

如果服务器决定为自己发送“没有上下文接管”(没有客户端请求),那就好了。在这种情况下,服务器不发送任何参数。

放气发送者总是可以使用它自己的下拉压缩上下文和/或减小压缩窗口大小。没有必要告诉听筒人。放气导线格式有足够的信息让接收器处理这一点。

这里是配置和握手与Crossbar.io的外观。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22169036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档