diff --git a/doc/api/net.markdown b/doc/api/net.markdown index e3ce8fb5863aa0..aadf8a84c1c1a6 100644 --- a/doc/api/net.markdown +++ b/doc/api/net.markdown @@ -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: diff --git a/lib/net.js b/lib/net.js index ce2033f9daf101..867e1df7ccc252 100644 --- a/lib/net.js +++ b/lib/net.js @@ -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 @@ -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. diff --git a/test/parallel/test-net-dns-custom-lookup.js b/test/parallel/test-net-dns-custom-lookup.js new file mode 100644 index 00000000000000..3979bbf0b6d2c5 --- /dev/null +++ b/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); +});