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 响应的形式,其 HTTP 状态类似于 40x 或 50x。规范允许这样做,但没有定义客户端应尝试从此类响应中预测任何特定错误消息的特定方式。

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

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

于 2012-05-28T20:05:08.617 回答