为啥 Firefox 不等待 WebSocket 连接?

Posted

技术标签:

【中文标题】为啥 Firefox 不等待 WebSocket 连接?【英文标题】:Why doesn't Firefox wait for WebSocket connection?为什么 Firefox 不等待 WebSocket 连接? 【发布时间】:2021-11-04 16:01:11 【问题描述】:

我正在编写一个应用程序,它首先尝试打开一个 WebSocket 连接(以确保没有其他连接打开;地址冲突检查),然后触发一个自定义协议,该协议将启动一个一次性 WebSocket 服务器,其地址为浏览器告诉它。所有通信都是通过 localhost 和一些任意端口号完成的,比如 3000。我没有做任何特别的事情,只是尝试打开一个 WebSocket:

var socket = new WebSocket("ws://localhost:3000/MyApp/");
socket.onclose = function(e)  console.error(e); 

在 Chrome 中进行测试时,WebSocket 实际上会保持一段时间的 CONNECTING 状态,这是理想的,因为它给了我们一些时间来通过自定义协议实际启动应用程序。但在 Firefox 中,WebSocket 立即 以代码 1006 关闭,我不知道为什么。

我尝试将 about:config network.websocket.timeout.open 设置更改为 1000(从 20 开始),但这没有帮助。我还发现了这个相关的帖子:Websockets - chrome and firefox differences?。这也没有让我找到答案。

我错过了什么?

21 年 11 月 16 日更新 我正在使用 Chrome 和 FF 中的开发工具来检查请求。奇怪的是,Chrome 实际上是按照您的预期发送请求标头,但在 FF 中,请求完全是空的(0 字节)。也许这是FF不支持调试本机WebSockets(没有使用包装库)的问题?是否有一些 FF 设置可以取消请求?但更令人困惑的是,浏览器会点击 close 事件而不会点击 open 事件。

21 年 11 月 17 日更新 我意识到这可能与启动自定义协议处理程序有关?我注意到如果 no CPH 启动,它将等待一秒钟以尝试连接到 Web 服务器,但是当我启动 CPH 时, 是立即关闭 WebSocket。 CPH 通过指向“_parent”的链接启动。

【问题讨论】:

【参考方案1】:

自定义协议似乎导致 FF 停止尝试提前连接。我在 JS 代码中创建了一个锚元素 ,并在构造它之后在其上调用了“click()”。无论我给它什么目标(例如_self),它都会导致连接尝试停止。

长话短说,启动一个链接,无论是 a.click、window.open 还是 location.replace,都会导致 Firefox 拒绝任何当前轮询的 WebSockets!

解决方法是只使用 iframe 来启动自定义协议。

【讨论】:

bugzilla.mozilla.org/show_bug.cgi?id=896666

以上是关于为啥 Firefox 不等待 WebSocket 连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何手动模拟 websocket 断开连接? (Firefox 或 Chrome 开发工具)

Firefox Websocket 安全问题

使用 Firefox Quantum 检查 Websocket 帧

为啥没有 Sec-WebSocket-Key1 的 WebSocket 不安全?

为啥websocket连接创建不通过http?

为啥 android webView 不支持 webSocket?