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对象logging到控制台,没有任何状态码或消息,我可以find。 当我通过ws://localhost:8001 ,httpServercallback不起作用,所以我无法在那里捕捉到它。 RFCbuild议当出现问题时,我应该能够发送除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协议在这个阶段没有提供任何特定的机制来提供closures的代码或原因。 拒绝的forms是HTTP响应的HTTP状态为40x或50x。 该规范允许这样做,但没有定义客户端应该试图从这样的响应中发现任何特定错误消息的具体方式。

实际上,只有当您拒绝来自不允许来源的用户时(即来自其他网站的用户未经授权而试图将用户连接到您的websocket服务器),或者当用户没有权限连接时(即他们没有login)。 后一种情况应该由您的站点上的其他代码处理:如果用户没有login,用户不应该尝试连接websocket连接。

WebSocket-Node允许你在这里指定的代码和原因是一个HTTP状态代码(例如404,500等),以及作为一个非标准的“X-WebSocket-Reject-Reason”响应。 在分析与数据包嗅探器(如WireShark)的连接时,它非常有用。 当连接被拒绝时,浏览器没有任何工具可以向客户端JavaScript代码提供拒绝代码或原因,因为WebSocket规范没有提供该代码。