如何解决Safari 10.1错误“无法发送WebSocket帧”?
问题描述:
Safari 10.1中的WebSocket API似乎具有最大数量的二进制数据,它可以缓冲,然后发送的下一条消息会得到错误“WebSocket连接失败:无法发送WebSocket帧”。如何解决Safari 10.1错误“无法发送WebSocket帧”?
Safari然后关闭与代码1006(CLOSE_ABNORMAL)的连接。
的WebSockets是supposed to report the bufferedAmount
- 但Safari浏览器始终报告0
后,直到发生错误,连接被关闭。
我试着只是在每条消息之间做一个setTimeout 100ms,而且这似乎适用于小数据块的情况,但是当我发送我的关闭JSON消息时,它看起来很脆,大块仍然会出错,即使有更长的延迟。
您可以see the bug in action here - “Play Sample”按钮在Safari 10.03中运行,但10.1中出现错误。 (Code that handles the WebSocket connection.)
有关如何解决此问题的任何想法?或甚至是什么限制?我知道Safari是开源的,但我不确定在哪里寻找。
更新:这里有一个简单的例子:
// this fails in Safari 10.1 but works in 10.03 (and other browsers)
var ws = new WebSocket('wss://echo.websocket.org');
ws.onerror = function(evt) {
// Not sure why, but error events seem to have no useful information
// The console, however, will have the following error:
// WebSocket connection to 'wss://echo.websocket.org/' failed: Failed to send WebSocket frame.
console.log("WebSocket error - see console for message");
}
ws.onclose = function(evt) {
console.log(`WebSocket closed with code: ${evt.code}, reason: ${evt.reason}`);
}
ws.onopen = function() {
console.log('sending first binary message');
ws.send(new Uint8Array(23085));
console.log('bufferedAmount is ' + ws.bufferedAmount);
// this gets the error
console.log('sending second binary message');
ws.send(new Uint8Array(23085));
console.log('bufferedAmount is ' + ws.bufferedAmount);
console.log('sending third binary message');
ws.send(new Uint8Array(23085));
console.log('bufferedAmount is ' + ws.bufferedAmount);
ws.close();
}
https://jsfiddle.net/yta2mjuf/2/
第二条消息得到一个错误关闭连接,第三个消息后,bufferedAmount
是23093.
答
我想你在Safari 10.1.2上的真实世界链接并没有看到问题。似乎它已被修复。
我在这里提交了一个关于WebKit的bug:https://bugs.webkit.org/show_bug.cgi?id=170463 –
我们遇到了同样的问题。我们的门槛似乎是UInt8Array的缓冲区(23085);更大的东西,我们看到相同的错误。 (我们也看到bufferedAmount总是报告0)。对不起现在不能有更多的帮助 - 不知道这是一个Safari错误还是一些新的安全问题。 – MikeB
同样在我们身边,等待修复... –