nodejs + WebSockets - 拒绝与消息的连接

Lan*_*don 10 javascript websocket node.js

我想在连接太多用户或从不受支持的域连接时向客户端提供有意义的错误,所以...

我写了一些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'); 
});
Run Code Online (Sandbox Code Playgroud)

还有一些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);
};
Run Code Online (Sandbox Code Playgroud)

我得到的只是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();
Run Code Online (Sandbox Code Playgroud)

Bri*_*vey 12

我是WebSocket-Node的作者,我也在GitHub上发布了相应问题的回复:https://github.com/Worlize/WebSocket-Node/issues/46

遗憾的是,WebSocket协议在拒绝客户端连接时不提供在此阶段提供密切代码或原因的任何特定机制.拒绝是HTTP响应的形式,HTTP状态为40x或50x.规范允许这样做,但没有定义客户端应该尝试从这样的响应中划分任何特定错误消息的特定方式.

实际上,只有当您拒绝来自不允许来源的用户(即来自其他网站的某人试图在未经许可的情况下将用户连接到您的websocket服务器)或者当用户没有连接权限时,才应在此阶段拒绝连接. (即他们没有登录).后一种情况应由您站点上的其他代码处理:如果用户未登录,则用户不应尝试连接websocket连接.

WebSocket-Node允许您在此处指定的代码和原因是HTTP状态代码(例如404,500等)以及作为非标准"X-WebSocket-Reject-Reason"HTTP头包含的原因响应.在分析与数据包嗅探器(例如WireShark)的连接时,它非常有用.当以这种方式拒绝连接时,没有任何浏览器可以为客户端JavaScript代码提供拒绝代码或原因,因为WebSocket规范中没有提供它.