当前位置: 首页 > 知识库问答 >
问题:

添加permessage deflate响应头后,websocket帧是否会自动压缩?

盖昊东
2023-03-14

底线是:

我没有看到web套接字消息被压缩,即使在请求和响应上都存在perMessage-压缩头。

一些细节:

我有一个nodejs服务器,我使用Primus(engine.io在下)。我使用Primus的“压缩”功能,以支持permessage delate。

在我打开它之后,我开始看到响应上的perMessage-缩小标题。

但是我没有看到websocket框架本身被压缩。

我使用charlesproxy嗅探流量,再一次-帧看起来和我打开“压缩”功能之前一样。

说明:

下面是来自webSocket握手的示例请求:

Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8,he;q=0.6,fr;q=0.4
Cache-Control:no-cache
Connection:Upgrade
Cookie:[some cookies]
Host:[our host]
Origin:https://[our host]
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:6nMxnGd0E8GrDg2s1B4tHQ==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36

这是相应的回答:

Connection:upgrade
Date:Tue, 11 Jul 2017 14:10:18 GMT
Sec-WebSocket-Accept:lLjOXWbLRVIHw2inxrhx0U1ryrM=
Sec-WebSocket-Extensions:permessage-deflate; client_no_context_takeover
Sec-WebSocket-Version:13
Server:nginx
Upgrade:websocket
WebSocket-Server:uWebSockets

这些示例取自Chrome开发工具网络检查器。我在charlesproxy嗅探器中看到了类似的东西。

其他参考:

我看到了:

在WebSockets中实现permessagedeflate

但是我在那里找不到一个有效的答案。

所以...

我错过了什么?我需要实施更多的东西吗?我需要包括任何图书馆吗?

版本:

  • 节点-4.2.4
  • primus-7.0.2
  • chrome:59.0.3071.115
  • FF: 54.0.1
  • 查尔斯: 4.1.4

非常感谢!

共有2个答案

曹疏珂
2023-03-14

我想我明白了。

在charles代理嗅探器中——我找到了在哪里可以看到压缩数据的视图(对于那些想知道的人来说——我看了wss的视图,它分解了网络套接字框架。压缩数据可以在超文本传输协议/https条目上看到,该条目表示webSocket握手,并具有“压缩”选项卡)。

我猜Chrome开发工具的网络嗅探器只是显示了压缩后的数据,所以它是人类可读的。

为了回答我自己的问题,我不认为我需要进一步实现一些东西来压缩数据。

蔺敏达
2023-03-14

问题是uws即使被指示这样做也不会压缩数据

看到这个问题https://github.com/socketio/engine.io/issues/474

如果您告诉engine.io使用ws而不是uws,它应该会工作。您可以通过将EIO_WS_ENGINEenv变量设置为ws或使用engine.iowsEngine选项来实现这一点。

我认为还有一个不压缩消息的大小阈值。如果我没有错的话,是1千磅。

 类似资料:
  • 问题内容: 我有一些代码: 我正在尝试通过使用JSON来应用这样的行(如jQuery文档中所示)或完全删除供应商前缀版本来改善此类行。 更改元素上的CSS属性时,jQuery的方法是否自动应用任何必需的供应商前缀? 问题答案: 正如@zeroflagL所写,自jQuery1.8.0起确实添加了浏览器特定的前缀。 在早期版本中,jQuery不会自动完成此操作。您将必须自己完成操作,也可以使用jQue

  • 我有一个flask web应用程序,它使用render_template如下所示。我需要在响应中添加一个Content-Security-Policy作为额外的http响应头。我试着按照方法走,但都失败了,给了我500。 1. 在终端上,当我以localhost身份访问web应用程序时,会看到以下内容:3001 127.0.0.1--[06/APR/2015 01:45:01]“GET/HTTP/

  • 我非常确定“Expires”是有效的HTTP响应头类型。但是当我尝试在代码中设置它时:(这是在ActionFilter.OnActionExecuted方法中) 我最后有一个例外: InvalidOperationException:错误使用的标头名称。确保请求头与HttpRequestMessage一起使用,响应头与HttpResponseMessage一起使用,内容头与HttpContent对

  • 我需要在每个响应中添加标题。我正打算在下面做 我想在之后这样做,以便一旦控制器处理它,我只是在返回客户端之前添加标头。是正确的吗? 但如何编写响应过滤器? 在已返回,对响应执行任何操作都为时已晚。此时,整个响应已经发送到客户端,您的代码无法访问它。 我觉得上面的说法不对。我不能在过滤链之后添加标题。doFilter(请求、响应)?如果不是,为什么? 我使用的是spring mvc。

  • 问题内容: 每当我对应用程序中的其余控制器发出请求以允许跨源资源共享时,我想将此标头添加到对客户端的每个响应中,目前我正在手动添加每个这样的方法的标头 它的工作,但非常令人沮丧。我在Spring文档中找到了webContentInterceptor,它允许我们修改每个响应的标头 但是当我使用它时,它会引发错误,即找不到名称为Access-Control-Allow-Origin的属性,因此还有其他

  • 问题内容: 我有一个Flask Web应用程序,它使用render_template如下,我需要在响应中添加一个Content-Security-Policy作为附加的HTTP响应标头。我尝试了以下方法,但都失败了,并给了我500。 1。 2。 这里有什么问题? 在终端上,以localhost:3001的身份访问Web应用程序时,我看到以下内容 127.0.0.1–[2015年4月6日01:45: