2017-04-03 1 views
16

Il semble que l'API WebSocket dans Safari 10.1 dispose d'une quantité maximale de données binaires qu'il peut tamponner, puis le message suivant reçoit l'erreur "Echec de la connexion WebSocket à ... Echec de l'envoi de la trame WebSocket". Safari ferme ensuite la connexion avec le code 1006 (CLOSE_ABNORMAL).Comment faire pour contourner l'erreur Safari 10.1 "Impossible d'envoyer la trame WebSocket"?

WebSockets sont supposed to report the bufferedAmount - mais Safari rapporte toujours 0 jusqu'à après l'erreur se produit et la connexion est fermée.

J'ai essayé juste faire 100ms un setTimeout entre chaque message, et qui semble fonctionner dans le cas des petits morceaux de données, mais il semble fragile et de gros morceaux obtenir encore des erreurs quand j'envoie mon fermeture message JSON, même avec un plus de retard.

Vous pouvez see the bug in action here - les boutons "Play Sample" fonctionnent dans Safari 10.03 mais erreur dans 10.1. (Code that handles the WebSocket connection.)

Des idées pour contourner ce problème? Ou quelle est la limite même? Je sais que Safari est Open Source, mais je ne sais pas où chercher.

Mise à jour: Voici un exemple simple:

// 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/

Le second message est une erreur ferme la connexion, et après le troisième message, bufferedAmount est 23093.

+4

J'ai déposé un bug sur WebKit ici: https://bugs.webkit.org/show_bug.cgi?id=170463 –

+1

nous éprouvons le même problème. Le seuil pour nous semble être un tampon de UInt8Array (23085); rien de plus grand, et nous voyons la même erreur. (Nous voyons aussi le bufferedAmount rapportant toujours 0). Désolé, nous ne pouvons pas vous aider plus en ce moment - ne savez pas s'il s'agit d'un bug de Safari ou d'un nouveau problème de sécurité. – MikeB

+0

le même de notre côté, en attendant le correctif ... –

Répondre

0

J'ai essayé votre lien réel sur Safari 10.1.2 et n'a pas vu le problème. Il semble qu'il a été corrigé.