底线是:
我没有看到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
但是我在那里找不到一个有效的答案。
所以...
我错过了什么?我需要实施更多的东西吗?我需要包括任何图书馆吗?
版本:
非常感谢!
我想我明白了。
在charles代理嗅探器中——我找到了在哪里可以看到压缩数据的视图(对于那些想知道的人来说——我看了wss的视图,它分解了网络套接字框架。压缩数据可以在超文本传输协议/https条目上看到,该条目表示webSocket握手,并具有“压缩”选项卡)。
我猜Chrome开发工具的网络嗅探器只是显示了压缩后的数据,所以它是人类可读的。
为了回答我自己的问题,我不认为我需要进一步实现一些东西来压缩数据。
问题是uws
即使被指示这样做也不会压缩数据。
看到这个问题https://github.com/socketio/engine.io/issues/474
如果您告诉engine.io
使用ws
而不是uws
,它应该会工作。您可以通过将EIO_WS_ENGINE
env变量设置为ws
或使用engine.io
的wsEngine
选项来实现这一点。
我认为还有一个不压缩消息的大小阈值。如果我没有错的话,是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: