nodejs + WebSockets - 拒绝带有消息的连接

nodejs + WebSockets - reject the connection with a message

本文关键字:消息 连接 拒绝 WebSockets nodejs      更新时间:2023-09-26

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

我写了一些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();

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