net: add lookup option to Socket.prototype.connect

Allows customization of the lookup function used when
Socket.prototype.connect is called using a hostname.

PR-URL: https://github.com/iojs/io.js/pull/1505
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
Reviewed-By: Yosuke Furukawa <yosuke.furukawa@gmail.com>
This commit is contained in:
Evan Lucas 2015-04-22 17:05:29 -05:00
parent 1bef717476
commit 4abe2fa1cf
3 changed files with 47 additions and 1 deletions

View File

@ -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:

View File

@ -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.

View File

@ -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);
});