底线:
我没有看到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
但我在那里找不到合适的答案。
因此...
我在这里缺少什么? 我需要实施更多的东西吗? 我需要包含任何库吗?
版本:
非常感谢!
答案 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开发工具的网络嗅探器只是在压缩后显示数据,因此它是人类可读的。
要回答我自己的问题,我认为我不需要进一步实施,以便压缩数据。