Skip to content

Commit

Permalink
lib: move default address logic to net._listen2
Browse files Browse the repository at this point in the history
When address is not provided to `server.listen()`, `_connectionKey` and
error messages should include actual address and correct family.

PR-URL: #539
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
  • Loading branch information
vkurchatkin authored and bnoordhuis committed Jan 23, 2015
1 parent 3143d73 commit 8de89ec
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
26 changes: 22 additions & 4 deletions lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -1110,9 +1110,29 @@ Server.prototype._listen2 = function(address, port, addressType, backlog, fd) {

// If there is not yet a handle, we need to create one and bind.
// In the case of a server sent via IPC, we don't need to do this.
if (!self._handle) {
if (self._handle) {
debug('_listen2: have a handle already');
} else {
debug('_listen2: create a handle');
var rval = createServerHandle(address, port, addressType, fd);

var rval = null;

if (!address && !util.isNumber(fd)) {
rval = createServerHandle('::', port, 6, fd);

if (util.isNumber(rval)) {
rval = null;
address = '0.0.0.0';
addressType = 4;
} else {
address = '::';
addressType = 6;
}
}

if (rval === null)
rval = createServerHandle(address, port, addressType, fd);

if (util.isNumber(rval)) {
var error = exceptionWithHostPort(rval, 'listen', address, port);
process.nextTick(function() {
Expand All @@ -1121,8 +1141,6 @@ Server.prototype._listen2 = function(address, port, addressType, backlog, fd) {
return;
}
self._handle = rval;
} else {
debug('_listen2: have a handle already');
}

self._handle.onconnection = onconnection;
Expand Down
11 changes: 11 additions & 0 deletions test/sequential/test-net-server-bind.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ server0.listen(function() {
// No callback to listen(), assume we can bind in 100 ms

var address1;
var connectionKey1;
var server1 = net.createServer(function(socket) { });

server1.listen(common.PORT);

setTimeout(function() {
address1 = server1.address();
connectionKey1 = server1._connectionKey;
console.log('address1 %j', address1);
server1.close();
}, 100);
Expand Down Expand Up @@ -68,6 +70,15 @@ server4.listen(common.PORT + 3, 127, function() {
process.on('exit', function() {
assert.ok(address0.port > 100);
assert.equal(common.PORT, address1.port);

var expectedConnectionKey1;

if (address1.family === 'IPv6')
expectedConnectionKey1 = '6::::' + address1.port;
else
expectedConnectionKey1 = '4:0.0.0.0:' + address1.port;

assert.equal(connectionKey1, expectedConnectionKey1);
assert.equal(common.PORT + 1, address2.port);
assert.equal(common.PORT + 2, address3.port);
assert.equal(common.PORT + 3, address4.port);
Expand Down

0 comments on commit 8de89ec

Please sign in to comment.