net: use cached peername to resolve remote fields

Allows socket.remote* properties to still be accessed even after the
socket is closed.

Fixes: https://github.com/joyent/node/issues/9287
PR-URL: https://github.com/joyent/node/pull/9366
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
James Hartig 2015-03-10 16:48:19 -04:00 committed by cjihrig
parent e6e616fdcb
commit 30666f22ca
2 changed files with 16 additions and 3 deletions

View File

@ -556,10 +556,10 @@ function onread(nread, buffer) {
Socket.prototype._getpeername = function() { Socket.prototype._getpeername = function() {
if (!this._handle || !this._handle.getpeername) {
return {};
}
if (!this._peername) { if (!this._peername) {
if (!this._handle || !this._handle.getpeername) {
return {};
}
var out = {}; var out = {};
var err = this._handle.getpeername(out); var err = this._handle.getpeername(out);
if (err) return {}; // FIXME(bnoordhuis) Throw? if (err) return {}; // FIXME(bnoordhuis) Throw?
@ -865,6 +865,7 @@ Socket.prototype.connect = function(options, cb) {
this._writableState.errorEmitted = false; this._writableState.errorEmitted = false;
this.destroyed = false; this.destroyed = false;
this._handle = null; this._handle = null;
this._peername = null;
} }
var self = this; var self = this;

View File

@ -20,6 +20,10 @@ var server = net.createServer(function(socket) {
socket.on('end', function() { socket.on('end', function() {
if (++conns_closed == 2) server.close(); if (++conns_closed == 2) server.close();
}); });
socket.on('close', function() {
assert.notEqual(-1, remoteAddrCandidates.indexOf(socket.remoteAddress));
assert.notEqual(-1, remoteFamilyCandidates.indexOf(socket.remoteFamily));
});
socket.resume(); socket.resume();
}); });
@ -32,12 +36,20 @@ server.listen(common.PORT, 'localhost', function() {
assert.equal(common.PORT, client.remotePort); assert.equal(common.PORT, client.remotePort);
client.end(); client.end();
}); });
client.on('close', function() {
assert.notEqual(-1, remoteAddrCandidates.indexOf(client.remoteAddress));
assert.notEqual(-1, remoteFamilyCandidates.indexOf(client.remoteFamily));
});
client2.on('connect', function() { client2.on('connect', function() {
assert.notEqual(-1, remoteAddrCandidates.indexOf(client2.remoteAddress)); assert.notEqual(-1, remoteAddrCandidates.indexOf(client2.remoteAddress));
assert.notEqual(-1, remoteFamilyCandidates.indexOf(client2.remoteFamily)); assert.notEqual(-1, remoteFamilyCandidates.indexOf(client2.remoteFamily));
assert.equal(common.PORT, client2.remotePort); assert.equal(common.PORT, client2.remotePort);
client2.end(); client2.end();
}); });
client2.on('close', function() {
assert.notEqual(-1, remoteAddrCandidates.indexOf(client2.remoteAddress));
assert.notEqual(-1, remoteFamilyCandidates.indexOf(client2.remoteFamily));
});
}); });
process.on('exit', function() { process.on('exit', function() {