从Node.js中的https.Server#clientError获取remoteAddress

在Node.js中, http.Serverhttps.Server发出clientError事件,但具有不同的参数:
http.Server#clientError(exception, socket)
https.Server#clientError(exception, securePair)

随着securePairsecurePair的一个实例, securePair.cleartext一个tls.CleartextStreamsecurePair.encrypted一个tls.CryptoStream

问题是:如何获得导致clientError的客户端的地址和端口? 理论上,这应该起作用:
socket = securePair.cleartext.socket;
console.log(socket.remoteAddress + ':' + socket.remotePort);

实际上,当我尝试使用HTTP(假装它是一个HTTP服务器)连接到HTTPS服务器并在几秒钟后取消时,我得到一个typesECONNRESET ,但是socket.remoteAddresssocket.remotePort都是undefined (even虽然securePair.cleartext.socket确实是一个net.Socket而不是undefined )。

不幸的是,赏金似乎没有太大的帮助:-(我必须自己调查一下。

显然,已经做了一个修复(但还没有在任何发布的node.js中),即使在socket被closures之后也能得到这些值: https : //github.com/joyent/node/commit/8c38b07252d86f4eef91344f8df4f0c3e38bca35

解决方法是在连接时存储地址:

 srv.on('connect', function (socket) { socket.stored_remoteAddress = socket.remoteAddress; }); srv.on('clientError', function (err, socket) { console.log(socket.cleartext.socket.stored_remoteAddress); } 

这工作,但不漂亮。


显然,即使这样也不行:-(

Node.js 0.11不会在SSL错误(例如)上发出'clientError'事件,所以无法捕捉到那里的情况。

Node.js 0.12发出'clientError'事件,但是使用了一个新的TLS实现,它没有可用的'cleartext'套接字。 我找不到任何方法将信息从'connect'事件传递给'clientError'事件,或者find它们是用于同一个套接字(因为套接字已经在'clientError'事件中closures了)。

所以,看来唯一的办法就是等待一个新的Node.js版本(0.12.2最早,如果他们认为这是值得修复的),并且希望这个版本能够得到解决。