Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRasmus Andersson <rasmus@notion.se>2010-08-09 04:53:55 +0400
committerRyan Dahl <ry@tinyclouds.org>2010-08-11 04:53:32 +0400
commitfd3cd755d15e37fd20aaadf22a30fc84a5cb737f (patch)
tree69fe62ee64511fb8d5ccf15eb352391c94ccaf98 /lib/dns.js
parent9395786d11b759bdefaa3ce0e6eb99582a5706fd (diff)
[dgram] only look up hostname for the requested address family
- [lib/dns.js] dns.lookup takes a new optional argument "family" which should be the integer 4, 6, dns.AF_INET or dns.AF_INET6. Passing a non-false "family" argument makes c-ares explicitly look up addresses for the specified family. - [test/simple/test-c-ares.js] test explicit address family lookups
Diffstat (limited to 'lib/dns.js')
-rw-r--r--lib/dns.js99
1 files changed, 73 insertions, 26 deletions
diff --git a/lib/dns.js b/lib/dns.js
index afd5cb1fcc5..84d5d3b5210 100644
--- a/lib/dns.js
+++ b/lib/dns.js
@@ -100,46 +100,93 @@ exports.getHostByName = function (domain, callback) {
var net;
// Easy DNS A/AAAA look up
-exports.lookup = function (domain, callback) {
- var addressType = dns.isIP(domain);
- if (addressType) {
- process.nextTick(function () {
- callback(null, domain, addressType);
- });
+// lookup(domain, [family,] callback)
+exports.lookup = function (domain, family, callback) {
+ if (arguments.length === 2) {
+ callback = family;
+ family = undefined;
+ } else if (family && family !== 4 && family !== 6) {
+ family = parseInt(family);
+ if (family === dns.AF_INET) {
+ family = 4;
+ } else if (family === dns.AF_INET6) {
+ family = 6;
+ } else if (family !== 4 && family !== 6) {
+ throw new Error('invalid argument: "family" must be 4 or 6');
+ }
+ }
+ if (!domain) {
+ callback(null, null, family === 6 ? 6 : 4);
+ return;
+ }
+ var matchedFamily = dns.isIP(domain);
+ if (matchedFamily) {
+ callback(null, domain, matchedFamily);
} else {
- if (/\w\.local\.?$/.test(domain) ) {
+ if (/\w\.local\.?$/.test(domain)) {
// ANNOYING: In the case of mDNS domains use NSS in the thread pool.
// I wish c-ares had better support.
process.binding('net').getaddrinfo(domain, 4, function (err, domains4) {
callback(err, domains4[0], 4);
});
} else {
- channel.getHostByName(domain, dns.AF_INET, function (err, domains4) {
- if (domains4 && domains4.length) {
- callback(null, domains4[0], 4);
- } else {
- channel.getHostByName(domain, dns.AF_INET6, function (err, domains6) {
- if (domains6 && domains6.length) {
- callback(null, domains6[0], 6);
+ if (family) {
+ // resolve names for explicit address family
+ var af = (family === 4) ? dns.AF_INET : dns.AF_INET6;
+ channel.getHostByName(domain, af, function (err, domains) {
+ if (!err && domains && domains.length) {
+ if (family !== dns.isIP(domains[0])) {
+ callback(new Error('not found'), []);
} else {
- callback(err, []);
+ callback(null, domains[0], family);
}
- });
- }
- });
+ } else {
+ callback(err, []);
+ }
+ });
+ } else {
+ // first resolve names for v4 and if that fails, try v6
+ channel.getHostByName(domain, dns.AF_INET, function (err, domains4) {
+ if (domains4 && domains4.length) {
+ callback(null, domains4[0], 4);
+ } else {
+ channel.getHostByName(domain, dns.AF_INET6,
+ function (err, domains6) {
+ if (domains6 && domains6.length) {
+ callback(null, domains6[0], 6);
+ } else {
+ callback(err, []);
+ }
+ });
+ }
+ });
+ }
}
}
};
-exports.resolve4 = function(domain, callback) { channel.query(domain, dns.A, callback) };
-exports.resolve6 = function(domain, callback) { channel.query(domain, dns.AAAA, callback) };
-exports.resolveMx = function(domain, callback) { channel.query(domain, dns.MX, callback) };
-exports.resolveTxt = function(domain, callback) { channel.query(domain, dns.TXT, callback) };
-exports.resolveSrv = function(domain, callback) { channel.query(domain, dns.SRV, callback) };
-exports.reverse = function(domain, callback) { channel.query(domain, dns.PTR, callback) };
-exports.resolveNs = function(domain, callback) { channel.query(domain, dns.NS, callback) };
-
+exports.resolve4 = function(domain, callback) {
+ channel.query(domain, dns.A, callback);
+};
+exports.resolve6 = function(domain, callback) {
+ channel.query(domain, dns.AAAA, callback);
+};
+exports.resolveMx = function(domain, callback) {
+ channel.query(domain, dns.MX, callback);
+};
+exports.resolveTxt = function(domain, callback) {
+ channel.query(domain, dns.TXT, callback);
+};
+exports.resolveSrv = function(domain, callback) {
+ channel.query(domain, dns.SRV, callback);
+};
+exports.reverse = function(domain, callback) {
+ channel.query(domain, dns.PTR, callback);
+};
+exports.resolveNs = function(domain, callback) {
+ channel.query(domain, dns.NS, callback);
+};
var resolveMap = {
'A' : exports.resolve4,