Skip to content

Commit

Permalink
net: add lookup option to Socket.prototype.connect
Browse files Browse the repository at this point in the history
Allows customization of the lookup function used when
Socket.prototype.connect is called using a hostname.

PR-URL: #1505
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
Reviewed-By: Yosuke Furukawa <yosuke.furukawa@gmail.com>
  • Loading branch information
evanlucas committed Apr 24, 2015
1 parent 1bef717 commit 4abe2fa
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
2 changes: 2 additions & 0 deletions doc/api/net.markdown
Expand Up @@ -355,6 +355,8 @@ For TCP sockets, `options` argument should be an object which specifies:
- `localPort`: Local port to bind to for network connections.

- `family` : Version of IP stack. Defaults to `4`.

- `lookup` : Custom lookup function. Defaults to `dns.lookup`.

For local domain sockets, `options` argument should be an object which
specifies:
Expand Down
6 changes: 5 additions & 1 deletion lib/net.js
Expand Up @@ -916,6 +916,9 @@ function lookupAndConnect(self, options) {
return;
}

if (options.lookup && typeof options.lookup !== 'function')
throw new TypeError('options.lookup should be a function.');

var dnsopts = {
family: options.family,
hints: 0
Expand All @@ -927,7 +930,8 @@ function lookupAndConnect(self, options) {
debug('connect: find host ' + host);
debug('connect: dns options ' + dnsopts);
self._host = host;
dns.lookup(host, dnsopts, function(err, ip, addressType) {
var lookup = options.lookup || dns.lookup;
lookup(host, dnsopts, function(err, ip, addressType) {
self.emit('lookup', err, ip, addressType);

// It's possible we were destroyed while looking this up.
Expand Down
40 changes: 40 additions & 0 deletions test/parallel/test-net-dns-custom-lookup.js
@@ -0,0 +1,40 @@
var common = require('../common');
var assert = require('assert');
var net = require('net');
var dns = require('dns');
var ok = false;

function check(addressType, cb) {
var server = net.createServer(function(client) {
client.end();
server.close();
cb && cb();
});

var address = addressType === 4 ? '127.0.0.1' : '::1';
server.listen(common.PORT, address, function() {
net.connect({
port: common.PORT,
host: 'localhost',
lookup: lookup
}).on('lookup', function(err, ip, type) {
assert.equal(err, null);
assert.equal(ip, address);
assert.equal(type, addressType);
ok = true;
});
});

function lookup(host, dnsopts, cb) {
dnsopts.family = addressType;
dns.lookup(host, dnsopts, cb);
}
}

check(4, function() {
common.hasIPv6 && check(6);
});

process.on('exit', function() {
assert.ok(ok);
});

0 comments on commit 4abe2fa

Please sign in to comment.