nodejs + WebSockets - lehnen die Verbindung mit einer Nachricht ab

8

Ich möchte dem Client einen aussagekräftigen Fehler geben, wenn zu viele Benutzer verbunden sind oder wenn sie eine Verbindung zu einer nicht unterstützten Domäne herstellen, also ...

Ich habe einen WebSocket-Servercode geschrieben:

%Vor%

Und einige WebSocket-Client-Code:

%Vor%

Alles, was ich bekomme, ist alert('onclose'); mit einem CloseEvent Objekt, das auf der Konsole ohne Statuscode oder Nachricht, die ich finden kann, protokolliert wird. Wenn ich mich über ws://localhost:8001 verbinde, kommt der httpServer Callback nicht ins Spiel, also kann ich ihn dort nicht fangen. Der RFC schlägt vor, dass ich einen anderen Statuscode als 101 senden sollte, wenn ein Problem auftritt, aber Chrome wirft einen Fehler auf die Konsole Unexpected response code: 102 . Wenn ich request.reject(101, 'gtfo') anrufe, was bedeutet, dass es erfolgreich war, bekomme ich einen Handshake-Fehler, wie ich es erwarten würde.

Ich bin mir nicht sicher, was ich sonst noch machen kann. Ist es derzeit nicht möglich, die Serverantwort in der WebSocket-Implementierung von Chrome abzurufen?

ETA: Das ist in der Zwischenzeit ein ziemlich hässlicher Hack, ich hoffe, dass ich nicht am Ende dran bin.

%Vor%     
Langdon 12.05.2012, 02:31
quelle

1 Antwort

11

Ich bin der Autor von WebSocket-Node und habe diese Antwort auch auf das entsprechende Thema auf GitHub geschrieben: Ссылка

Leider bietet das WebSocket-Protokoll zu diesem Zeitpunkt keinen spezifischen Mechanismus zum Bereitstellen eines Schließungscodes oder -grunds, wenn eine Clientverbindung abgelehnt wird. Die Ablehnung erfolgt in Form einer HTTP-Antwort mit einem HTTP-Status von etwa 40x oder 50x. Die Spezifikation lässt dies zu, definiert jedoch keine spezifische Art und Weise, in der der Client versuchen sollte, eine bestimmte Fehlermeldung aus einer solchen Antwort zu erraten.

In Wirklichkeit sollten Verbindungen zu diesem Zeitpunkt nur dann abgelehnt werden, wenn Sie einen Benutzer von einem unzulässigen Ursprung ablehnen (dh jemand von einer anderen Website versucht, Benutzer ohne Erlaubnis mit Ihrem Websocket-Server zu verbinden) oder wenn ein Benutzer dies nicht hat Erlaubnis zur Verbindung (dh sie sind nicht angemeldet). Der letzte Fall sollte von anderem Code auf Ihrer Site behandelt werden: Ein Benutzer sollte nicht in der Lage sein, die Websocket-Verbindung herzustellen, wenn sie nicht angemeldet sind.

Der Code und der Grund, den WebSocket-Node hier angeben können, sind ein HTTP-Statuscode (z. B. 404, 500 usw.) und ein Grund für die Aufnahme eines nicht standardmäßigen "X-WebSocket-Reject-Reason" -Hodes Header in der Antwort. Dies ist vor allem nützlich, wenn Sie die Verbindung mit einem Packet Sniffer wie WireShark analysieren. Kein Browser hat die Möglichkeit, dem clientseitigen JavaScript-Code Ablehnungscodes oder Gründe zu geben, wenn eine Verbindung auf diese Weise abgelehnt wird, weil dies in der WebSocket-Spezifikation nicht vorgesehen ist.

    
Brian McKelvey 28.05.2012, 20:05
quelle

Tags und Links