web-dev-qa-db-fra.com

obtenir la raison pour laquelle les websockets ont fermé avec le code de fermeture 1006

Je souhaite que la raison Websockets soit fermée afin de pouvoir afficher le bon message à l'utilisateur.

J'ai

sok.onerror=function (evt) 
     {//since there is an error, sockets will close so...
       sok.onclose=function(e){
           console.log("WebSocket Error: " , e);}

Le code est toujours 1006 et la raison est toujours "". Mais je veux dire différentes raisons de clôture à part.

Par exemple, la ligne de commande donne un motif d'erreur: "vous ne pouvez pas supprimer cela, car la base de données ne vous le permet pas". Mais sur la console de Chrome, la raison en est toujours "". 

Y a-t-il un autre moyen de distinguer différentes raisons de fermeture?

52
slevin

Code de fermeture 1006 est un code spécial qui signifie que la connexion a été fermée de manière anormale (localement) par la mise en œuvre du navigateur.

Si votre client de navigateur indique que le code 1006 a été fermé, consultez l’événement websocket.onerror(evt) pour plus de détails.

Cependant, Google Chrome signalera rarement les 1006 raisons du code de fermeture du côté javascript. Cela est probablement dû aux règles de sécurité du client dans la spécification WebSocket pour empêcher l'utilisation abusive de Websocket. (par exemple, son utilisation pour rechercher des ports ouverts sur un serveur de destination ou pour générer de nombreuses connexions en cas d'attaque par déni de service).

Notez que Chrome signalera souvent un code de fermeture 1006 en cas d'erreur lors de la mise à niveau HTTP vers Websocket (c'est l'étape à laquelle un websocket est techniquement "connecté"). Pour des raisons telles qu'une mauvaise authentification ou autorisation, ou une mauvaise utilisation du protocole (par exemple, demander un sous-protocole, mais le serveur lui-même ne prend pas en charge ce même sous-protocole), ou même tenter de parler à un emplacement de serveur autre qu'un websocket ( comme tenter de se connecter à ws://images.google.com/)

Fondamentalement, si vous voyez un code fermer 1006, vous avez une erreur de très bas niveau avec websocket lui-même (semblable à "Unable to Open File" ou "Socket Error"), qui n'est pas vraiment destiné à l'utilisateur car il pointe vers un niveau bas. problème avec votre code et mise en œuvre. Résolvez vos problèmes de bas niveau et, lorsque vous êtes connecté, vous pouvez inclure des codes d'erreur plus raisonnables. Vous pouvez accomplir cela en termes de portée ou de gravité dans votre projet. Exemple: les informations et les niveaux d'avertissement font partie du protocole spécifique de votre projet et n'entraînent pas la fin de la connexion. Avec les messages graves ou fatals, les rapports utilisent également le protocole de votre projet pour transmettre autant de détails que vous le souhaitez, puis fermez la connexion en utilisant les capacités limitées du flux de fermeture websocket.

Sachez que les codes de fermeture WebSocket sont définis de manière très stricte et que la phrase/le message de motif de fermeture ne peut pas dépasser 123 caractères (il s'agit d'une limitation intentionnelle de la mémoire Web).

Mais tout n'est pas perdu, si vous souhaitez simplement obtenir ces informations pour des raisons de débogage, les détails de la fermeture et la raison sous-jacente sont souvent signalés avec suffisamment de détails dans la console javascript de Chrome.

83
Joakim Erdfelt

J'ai l'erreur en utilisant Chrome en tant que client et golang gorilla Websocket en tant que serveur sous un proxy nginx

Et en envoyant juste un message "ping" du serveur au client chaque problème résolu x secondes

1
BIOHAZARD

Il semble que ce soit le cas lorsque Chrome n'est pas conforme à la norme WebSocket . Lorsque le serveur initie close et envoie un cadre proche à un client, Chrome considère qu'il s'agit d'une erreur et le signale au côté JS code 1006 et aucun message de motif . Lors de mes tests, Chrome ne répond jamais aux images de fermeture déclenchées par le serveur (code proche 1000), ce qui suggère que le code 1006 signifie probablement que Chrome signale sa propre erreur interne.

P.S. Firefox v57.00 gère correctement ce cas et transmet correctement le message de motif du serveur au côté JS.

0
user10663464

Dans mon cas, et probablement @BIOHAZARD, il s’agissait de nginx proxy timeout. Par défaut c'est 60 sec sans activité dans le socket

Je l'ai changé en 24h dans nginx et le problème a été résolu

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
0
MixerOID