net: add lookup option to Socket.prototype.connect
authorEvan Lucas <evanlucas@me.com>
Wed, 22 Apr 2015 22:05:29 +0000 (17:05 -0500)
committerEvan Lucas <evanlucas@me.com>
Fri, 24 Apr 2015 12:53:16 +0000 (07:53 -0500)
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>
doc/api/net.markdown
lib/net.js
test/parallel/test-net-dns-custom-lookup.js [new file with mode: 0644]

index e3ce8fb..aadf8a8 100644 (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:
index ce2033f..867e1df 100644 (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.
diff --git a/test/parallel/test-net-dns-custom-lookup.js b/test/parallel/test-net-dns-custom-lookup.js
new file mode 100644 (file)
index 0000000..3979bbf
--- /dev/null
@@ -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);
+});