结合“连接:保持活跃,升级”的Firefox与移动运营商代理

时间:2018-05-05 18:34:33

标签: javascript websocket http-headers keep-alive

我在服务器盒上运行了一个WebSocketServer,网站试图连接到它并发送来回信息。

我注意到在WiFi上它可以在我测试的所有浏览器上完美运行,但是在Mobile Data Firefox上。我拦截并编辑了标题并设法重现问题。 Firefox正在请求中发送组合标头Connection: keep-alive, Upgrade。相比之下,Chrome只发送Connection: Upgrade。我的理论是,当请求通过移动数据提供程序的代理,以及添加自己的标识头时,它会重新解析所有其他头,并且不理解组合头。事实证明,在服务器端,收到了请求(来自Firefox),但Connection标头被截断为Connection: keep-alive。如果我使用拦截程序从keep-alive标题中手动删除Connection,问题就解决了。

我不需要请求的keep-alive部分(事实上,如果有什么我不希望它不被启用)那么我问是否有办法阻止Firefox发送它而不使用about :config etc(例如在JS或HTML中),因为我希望这能为普通的最终用户工作。

非常感谢,
理查德

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,此后解决了。

就我而言,问题是我的托管服务提供商提供的代理无法正确处理Connection和/或Upgrade标头。实际上,这些标头是hop-by-hop,因此:

  

逐跳标题   仅对单个传输级别的连接有意义, 不得通过代理进行重新传输 。这样的标头是:连接,保持活动,代理身份验证,代理授权,TE,尾随,传输编码和升级。请注意,只能使用Connection常规标头设置逐跳标头。

来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers

不久,这些标头不会重新传输,而是以某种方式解释后才传递给您的服务器。当Firefox发送这些标头时,此解释阶段变得至关重要,因为与其他浏览器发送的Connection标头关联的值“更复杂”,即

Firefox发送Connection: keep-alive, Upgrade

Chrome / Edge / ...发送Connection: Upgrade


解决方案:我只是告诉托管服务提供商,当一个人发送Connection: keep alive AND Upgrade: <my_protocole> 时,只有Connection: keep alive, Upgrade到达我的服务器(他有可能在72小时内更正问题)