10

接続しているユーザーが多すぎる場合、またはサポートされていないドメインから接続している場合に、クライアントに意味のあるエラーを提供したいので...

WebSocket サーバー コードをいくつか書きました。

var http = require('http');
var httpServer = http.createServer(function (request, response)
{
    // i see this if i hit http://localhost:8001/
    response.end('go away');
});

httpServer.listen(8001);

// https://github.com/Worlize/WebSocket-Node/wiki/Documentation
var webSocket = require('websocket');
var webSocketServer = new webSocket.server({ 'httpServer': httpServer });

webSocketServer.on('request', function (request)
{
    var connection = request.reject(102, 'gtfo'); 
});

そして、いくつかの WebSocket クライアント コード:

var connection = new WebSocket('ws://127.0.0.1:8001');
connection.onopen = function (openEvent)
{
    alert('onopen');
    console.log(openEvent);
};
connection.onclose = function (closeEvent)
{
    alert('onclose');
    console.log(closeEvent);
}
connection.onerror = function (errorEvent)
{
    alert('onerror');
    console.log(errorEvent);
};
connection.onmessage = function (messageEvent)
{
    alert('onmessage');
    console.log(messageEvent);
};

私が得るのは、コンソールに記録されalert('onclose');CloseEventオブジェクトだけで、ステータスコードやメッセージは見つかりません。ws://localhost:8001httpServer コールバックを介して接続すると、機能しないため、そこでキャッチできません。RFC では、問題が発生したときに 101 以外のステータス コードを送信できるはずですが、Chrome はコンソールにエラーをスローしますUnexpected response code: 102。を呼び出すとrequest.reject(101, 'gtfo')、期待どおり、成功したことを意味するハンドシェイク エラーが発生します。

他に何ができるか本当にわかりません。ChromeのWebSocket実装でサーバーの応答を取得することは今のところ不可能ですか?

ETA:それまでの間、これは非常に厄介なハックです。

var connection = request.accept(null, request.origin);
connection.sendUTF('gtfo');
connection.close();
4

1 に答える 1

12

私は WebSocket-Node の作成者であり、GitHub の対応する問題に対するこの応答も投稿しました: https://github.com/Worlize/WebSocket-Node/issues/46

残念ながら、WebSocket プロトコルは、この段階でクライアント接続を拒否する際に終了コードまたは理由を提供するための特定のメカニズムを提供しません。拒否は、HTTP ステータスが 40x や 50x などの HTTP 応答の形式で行われます。仕様ではこれが許可されていますが、クライアントがそのような応答から特定のエラー メッセージを推測しようとする特定の方法は定義されていません。

実際には、この段階で接続を拒否する必要があるのは、許可されていないオリジンからのユーザーを拒否する場合 (つまり、別の Web サイトの誰かが許可なくユーザーを Websocket サーバーに接続しようとしている場合)、またはユーザーが接続する権限を持っていない場合のみです。 (つまり、ログインしていません)。後者のケースは、サイトの他のコードで処理する必要があります。ユーザーは、ログインしていない場合、websocket 接続を試行できないようにする必要があります。

WebSocket-Node でここに指定できるコードと理由は、HTTP ステータス コード (404、500 など) と、非標準の「X-WebSocket-Reject-Reason」HTTP ヘッダーとして含める理由です。応答。これは、WireShark などのパケット スニファを使用して接続を分析する場合に最も役立ちます。WebSocket 仕様で提供されていないため、この方法で接続が拒否された場合に、クライアント側の JavaScript コードに拒否コードまたは理由を提供する機能を備えたブラウザーはありません。

于 2012-05-28T20:05:08.617 に答える