Skip to content

Commit

Permalink
net: Allow custom DNS resolvers
Browse files Browse the repository at this point in the history
net.connect now checks whether the user has provided a dns
resolution function, this arguments and expected output
for which mirror the existing dns.lookup implementation.

Fixes nodejs#8475
  • Loading branch information
cdlewis committed Oct 17, 2014
1 parent cfcb1de commit 59957ca
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 2 deletions.
4 changes: 3 additions & 1 deletion doc/api/net.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@ 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`.
- `family`: Version of IP stack. Defaults to `4`.

- `resolver`: Function to resolve domain names. Defaults to `dns.lookup`.

For local domain sockets, `options` argument should be an object which
specifies:
Expand Down
9 changes: 8 additions & 1 deletion lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -887,6 +887,7 @@ Socket.prototype.connect = function(options, cb) {
} else {
var dns = require('dns');
var host = options.host;
var resolver = options.resolver;
var dnsopts = {
family: options.family,
hints: 0
Expand All @@ -898,7 +899,13 @@ Socket.prototype.connect = function(options, cb) {
debug('connect: find host ' + host);
debug('connect: dns options ' + dnsopts);
self._host = host;
dns.lookup(host, dnsopts, function(err, ip, addressType) {

if (!util.isFunction(resolver)) {
debug('connect: using default resolver (dns.lookup)');
resolver = dns.lookup;
}

resolver(host, dnsopts, function(err, ip, addressType) {
self.emit('lookup', err, ip, addressType);

// It's possible we were destroyed while looking this up.
Expand Down
48 changes: 48 additions & 0 deletions test/simple/test-net-resolver.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var common = require('../common');
var assert = require('assert');
var net = require('net');

var resolver_called = false;
var connection_ok = false;

var server = net.createServer(function(client) {
client.end();
server.close();
});

function simple_resolver(host, options, callback) { // world's worst dns resolver
resolver_called = true;
callback(false, '127.0.0.1', 4);
}

server.listen(common.PORT, 'localhost', function() {
net.connect({port: common.PORT, host: 'localhost', resolver: simple_resolver}).on('connect', function() {
connection_ok = true;
});
});

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

0 comments on commit 59957ca

Please sign in to comment.