2012-05-12 48 views
8

我想提供一个有意义的错误给客户当太多用户连接或当他们从一个不域连接的连接,所以......+的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对象记录到控制台没有任何状态代码或消息,我可以找到。当我通过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(); 
+0

网址ws://127.0.0.1:8001是否与提供网页的网址匹配? – akonsu

+0

我的意思是包含客户端代码的页面。 – akonsu

+0

@akonsu意思是它在同一个域名?不,我在本地运行它file:///,这不是一个问题,因为我没有验证'request.origin'。 – Langdon

回答

11

我的WebSocket节点的作者,我也张贴了这个响应对应的问题在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规范中提供。

+0

感谢您的洞察力。 – Langdon