添加渗透 - 放气响应头后,websocket框架是否会自动压缩?

时间:2017-07-11 10:29:05

标签: compression

底线:

我没有看到websocket消息被压缩,即使请求和响应都存在permessage-deflate标头。

一些细节:

我有一个nodejs服务器,我使用Primus(下面是engine.io)。 我使用Primus的'压缩'功能,以支持渗透 - 延迟。

在我打开它之后,我开始在响应中看到渗透 - 缩写标题。

但我没有看到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嗅探器中看到类似的东西。

其他参考:

我看到了这个:

Implementing permessage-deflate in WebSockets

但我在那里找不到合适的答案。

因此...

我在这里缺少什么? 我需要实施更多的东西吗? 我需要包含任何库吗?

版本:

  • node - 4.2.4
  • primus - 7.0.2
  • chrome:59.0.3071.115
  • FF:54.0.1
  • charles:4.1.4

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

请参阅此问题https://github.com/socketio/engine.io/issues/474

如果您告诉engine.io使用ws而不是uws,那么它应该会有效。您可以将EIO_WS_ENGINE env变量设置为ws或使用wsEngine的{​​{1}}选项来完成此操作。

我认为还有一个大小阈值,在此阈值下不会压缩邮件。如果我没错,那就是1 KiB。

答案 1 :(得分:0)

我想我已经明白了。

在charlesproxy嗅探器中 - 我找到了哪里可以看到压缩数据的视图(对于那些想知道的人 - 我查看了wss的视图,它打破了websocket框架。压缩数据可以在http / https条目,代表websocket握手,并有一个“压缩”选项卡。

我认为Chrome开发工具的网络嗅探器只是在压缩后显示数据,因此它是人类可读的。

要回答我自己的问题,我认为我不需要进一步实施,以便压缩数据。