Browse Source

dns: use faster IP address type check on results

PR-URL: https://github.com/nodejs/node/pull/13261
Reviewed-By: Roman Reiss <me@silverwind.io>
Reviewed-By: James M Snell <jasnell@gmail.com>
v6
Brian White 8 years ago
parent
commit
3c989de207
No known key found for this signature in database GPG Key ID: 606D7358F94DA209
  1. 40
      lib/dns.js

40
lib/dns.js

@ -60,6 +60,31 @@ function errnoException(err, syscall, hostname) {
return ex; return ex;
} }
const digits = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0-15
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32-47
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48-63
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 64-79
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80-95
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 96-111
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 112-127
];
function isIPv4(str) {
if (!digits[str.charCodeAt(0)]) return false;
if (str.length === 1) return false;
if (str.charCodeAt(1) === 46/*'.'*/)
return true;
else if (!digits[str.charCodeAt(1)])
return false;
if (str.length === 2) return false;
if (str.charCodeAt(2) === 46/*'.'*/)
return true;
else if (!digits[str.charCodeAt(2)])
return false;
return (str.length > 3 && str.charCodeAt(3) === 46/*'.'*/);
}
function onlookup(err, addresses) { function onlookup(err, addresses) {
if (err) { if (err) {
@ -68,25 +93,26 @@ function onlookup(err, addresses) {
if (this.family) { if (this.family) {
this.callback(null, addresses[0], this.family); this.callback(null, addresses[0], this.family);
} else { } else {
this.callback(null, addresses[0], addresses[0].indexOf(':') >= 0 ? 6 : 4); this.callback(null, addresses[0], isIPv4(addresses[0]) ? 4 : 6);
} }
} }
function onlookupall(err, addresses) { function onlookupall(err, addresses) {
var results = [];
if (err) { if (err) {
return this.callback(errnoException(err, 'getaddrinfo', this.hostname)); return this.callback(errnoException(err, 'getaddrinfo', this.hostname));
} }
var family = this.family;
for (var i = 0; i < addresses.length; i++) { for (var i = 0; i < addresses.length; i++) {
results.push({ const addr = addresses[i];
address: addresses[i], addresses[i] = {
family: this.family || (addresses[i].indexOf(':') >= 0 ? 6 : 4) address: addr,
}); family: family || (isIPv4(addr) ? 4 : 6)
};
} }
this.callback(null, results); this.callback(null, addresses);
} }

Loading…
Cancel
Save