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

时间:2014-08-12 06:37:32

标签: node.js sockets ssl https

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

securePairtls.SecurePairsecurePair.cleartext一个tls.CleartextStreamsecurePair.encrypted一个tls.CryptoStream的实例。

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

实际上,当我尝试使用HTTP连接到HTTPS服务器(假装它是一个HTTP服务器)并在几秒钟后取消时,我得到一个类型为clientError的{​​{1}},但{ {1}}和ECONNRESET都是socket.remoteAddress(即使socket.remotePort确实是undefined而不是securePair.cleartext.socket)。

1 个答案:

答案 0 :(得分:2)

不幸的是,赏金似乎并没多大帮助:-(我不得不自己调查一下。

显然,已经修复(但尚未在任何已发布的node.js中),即使在套接字关闭后也能够获取这些值: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'事件,或者找出它们是针对同一个套接字的任何方式(因为套接字已在'clientError'事件中关闭)。

所以,似乎唯一的方法就是等待一个新的Node.js版本(最早的0.12.2,如果他们认为这是值得修复的话),并希望这个问题得到修复。