nodejs + WebSockets-отклонить соединение с сообщением

Я хочу предоставить значимую ошибку клиенту, когда слишком много пользователей подключены или когда они подключаются из неподдерживаемого домена, поэтому...

я написал код сервера 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:8001 обратный вызов httpServer не вступает в игру, поэтому я не могу поймать его там. The RFC предполагает, что я должен иметь возможность отправлять любой код состояния, кроме 101, когда есть проблема, но Chrome выдает ошибку в консоли Unexpected response code: 102. Если я позову request.reject(101, 'gtfo'), подразумевая, что это было успешно, я получаю ошибку рукопожатия, как и следовало ожидать.

не знаю, что еще я могу сделать. Разве сейчас невозможно получить ответ сервера в реализации WebSocket Chrome?

ЕТА: вот действительно неприятный Хак в то же время, я надеюсь, что это не то, что я должен делать.

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

1 ответов


Я автор WebSocket-Node, и я также опубликовал этот ответ на соответствующий вопрос на GitHub:https://github.com/Worlize/WebSocket-Node/issues/46

к сожалению, протокол WebSocket не предоставляет какого-либо конкретного механизма для предоставления закрытого кода или причины на данном этапе при отклонении клиентского соединения. Отклонение выполняется в виде HTTP-ответа со статусом HTTP 40x или 50x. Спецификация позволяет это, но не определяет конкретный способ, которым клиент должен пытаться угадать какие-либо конкретные сообщения об ошибках из такого ответа.

на самом деле соединения должны быть отклонены на этом этапе только тогда, когда вы отклоняете пользователя из запрещенного источника (т. е. кто-то с другого веб-сайта пытается подключить пользователей к вашему серверу websocket без разрешения) или когда пользователь иначе не имеет разрешения на подключение (т. е. они не вошли в систему). Последнее дело должно рассматриваться другими код на вашем сайте: пользователь не должен пытаться подключить соединение websocket, если он не вошел в систему.

код и причина, по которой WebSocket-Node позволяет вам указать здесь, - это код состояния HTTP (например, 404, 500 и т. д.) и причина включения в качестве нестандартного HTTP-заголовка "X-WebSocket-Reject-Reason" в ответ. Это в основном полезно при анализе соединения с помощью анализатора пакетов, такого как WireShark. Ни один браузер не имеет возможности предоставлять коды отклонения или причины кода JavaScript на стороне клиента, когда соединение отклоняется таким образом, потому что это не предусмотрено в спецификации WebSocket.