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

时间:2012-05-12 02:31:19

标签: javascript node.js websocket

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

我写了一些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回调没有发挥作用,所以我无法在那里捕捉它。 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();

1 个答案:

答案 0 :(得分:11)

我是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规范中没有提供它。