dns: set hostname property on error object
Make debugging and logging easier: when a DNS lookup for a hostname fails, set the hostname as a property on the error object. Fixes #5393.
This commit is contained in:
parent
ceb8740a63
commit
a2d1cbef6b
21
lib/dns.js
21
lib/dns.js
@ -28,7 +28,7 @@ var uv = process.binding('uv');
|
|||||||
var isIp = net.isIP;
|
var isIp = net.isIP;
|
||||||
|
|
||||||
|
|
||||||
function errnoException(err, syscall) {
|
function errnoException(err, syscall, hostname) {
|
||||||
// FIXME(bnoordhuis) Remove this backwards compatibility shite and pass
|
// FIXME(bnoordhuis) Remove this backwards compatibility shite and pass
|
||||||
// the true error to the user. ENOTFOUND is not even a proper POSIX error!
|
// the true error to the user. ENOTFOUND is not even a proper POSIX error!
|
||||||
if (err === uv.UV_EAI_MEMORY ||
|
if (err === uv.UV_EAI_MEMORY ||
|
||||||
@ -36,14 +36,19 @@ function errnoException(err, syscall) {
|
|||||||
err === uv.UV_EAI_NONAME) {
|
err === uv.UV_EAI_NONAME) {
|
||||||
err = 'ENOTFOUND';
|
err = 'ENOTFOUND';
|
||||||
}
|
}
|
||||||
|
var ex = null;
|
||||||
if (typeof err === 'string') { // c-ares error code.
|
if (typeof err === 'string') { // c-ares error code.
|
||||||
var ex = new Error(syscall + ' ' + err);
|
ex = new Error(syscall + ' ' + err);
|
||||||
ex.code = err;
|
ex.code = err;
|
||||||
ex.errno = err;
|
ex.errno = err;
|
||||||
ex.syscall = syscall;
|
ex.syscall = syscall;
|
||||||
return ex;
|
} else {
|
||||||
|
ex = util._errnoException(err, syscall);
|
||||||
}
|
}
|
||||||
return util._errnoException(err, syscall);
|
if (hostname) {
|
||||||
|
ex.hostname = hostname;
|
||||||
|
}
|
||||||
|
return ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -83,7 +88,7 @@ function makeAsync(callback) {
|
|||||||
|
|
||||||
function onlookup(err, addresses) {
|
function onlookup(err, addresses) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return this.callback(errnoException(err, 'getaddrinfo'));
|
return this.callback(errnoException(err, 'getaddrinfo', this.hostname));
|
||||||
}
|
}
|
||||||
if (this.family) {
|
if (this.family) {
|
||||||
this.callback(null, addresses[0], this.family);
|
this.callback(null, addresses[0], this.family);
|
||||||
@ -133,10 +138,11 @@ exports.lookup = function(hostname, family, callback) {
|
|||||||
var req = {
|
var req = {
|
||||||
callback: callback,
|
callback: callback,
|
||||||
family: family,
|
family: family,
|
||||||
|
hostname: hostname,
|
||||||
oncomplete: onlookup
|
oncomplete: onlookup
|
||||||
};
|
};
|
||||||
var err = cares.getaddrinfo(req, hostname, family);
|
var err = cares.getaddrinfo(req, hostname, family);
|
||||||
if (err) throw errnoException(err, 'getaddrinfo');
|
if (err) throw errnoException(err, 'getaddrinfo', hostname);
|
||||||
|
|
||||||
callback.immediately = true;
|
callback.immediately = true;
|
||||||
return req;
|
return req;
|
||||||
@ -145,7 +151,7 @@ exports.lookup = function(hostname, family, callback) {
|
|||||||
|
|
||||||
function onresolve(err, result) {
|
function onresolve(err, result) {
|
||||||
if (err)
|
if (err)
|
||||||
this.callback(errnoException(err, this.bindingName));
|
this.callback(errnoException(err, this.bindingName, this.hostname));
|
||||||
else
|
else
|
||||||
this.callback(null, result);
|
this.callback(null, result);
|
||||||
}
|
}
|
||||||
@ -159,6 +165,7 @@ function resolver(bindingName) {
|
|||||||
var req = {
|
var req = {
|
||||||
bindingName: bindingName,
|
bindingName: bindingName,
|
||||||
callback: callback,
|
callback: callback,
|
||||||
|
hostname: name,
|
||||||
oncomplete: onresolve
|
oncomplete: onresolve
|
||||||
};
|
};
|
||||||
var err = binding(req, name);
|
var err = binding(req, name);
|
||||||
|
@ -393,6 +393,45 @@ TEST(function test_lookup_localhost_ipv4(done) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TEST(function test_reverse_failure(done) {
|
||||||
|
var req = dns.reverse('0.0.0.0', function(err) {
|
||||||
|
assert(err instanceof Error);
|
||||||
|
assert.strictEqual(err.code, 'ENOTFOUND'); // Silly error code...
|
||||||
|
assert.strictEqual(err.hostname, '0.0.0.0');
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
checkWrap(req);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TEST(function test_lookup_failure(done) {
|
||||||
|
var req = dns.lookup('nosuchhostimsure', function(err) {
|
||||||
|
assert(err instanceof Error);
|
||||||
|
assert.strictEqual(err.code, 'ENOTFOUND'); // Silly error code...
|
||||||
|
assert.strictEqual(err.hostname, 'nosuchhostimsure');
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
checkWrap(req);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
TEST(function test_resolve_failure(done) {
|
||||||
|
var req = dns.resolve4('nosuchhostimsure', function(err) {
|
||||||
|
assert(err instanceof Error);
|
||||||
|
assert.strictEqual(err.code, 'ENOTFOUND'); // Silly error code...
|
||||||
|
assert.strictEqual(err.hostname, 'nosuchhostimsure');
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
checkWrap(req);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
/* Disabled because it appears to be not working on linux. */
|
/* Disabled because it appears to be not working on linux. */
|
||||||
/* TEST(function test_lookup_localhost_ipv6(done) {
|
/* TEST(function test_lookup_localhost_ipv6(done) {
|
||||||
var req = dns.lookup('localhost', 6, function(err, ip, family) {
|
var req = dns.lookup('localhost', 6, function(err, ip, family) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user