mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 21:58:48 +02:00

PR-URL: https://github.com/nodejs/node/pull/58440 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
77 lines
2.3 KiB
JavaScript
77 lines
2.3 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
const dnstools = require('../common/dns');
|
|
const dns = require('dns');
|
|
const assert = require('assert');
|
|
const dgram = require('dgram');
|
|
|
|
[
|
|
-1,
|
|
1.1,
|
|
NaN,
|
|
undefined,
|
|
{},
|
|
[],
|
|
null,
|
|
function() {},
|
|
Symbol(),
|
|
true,
|
|
Infinity,
|
|
].forEach((maxTimeout) => {
|
|
try {
|
|
new dns.Resolver({ maxTimeout });
|
|
} catch (e) {
|
|
assert.ok(/ERR_OUT_OF_RANGE|ERR_INVALID_ARG_TYPE/i.test(e.code));
|
|
}
|
|
});
|
|
|
|
const server = dgram.createSocket('udp4');
|
|
const nxdomain = 'nxdomain.org';
|
|
const domain = 'example.org';
|
|
const answers = [{ type: 'A', address: '1.2.3.4', ttl: 123, domain }];
|
|
|
|
server.on('message', common.mustCallAtLeast((msg, { address, port }) => {
|
|
const parsed = dnstools.parseDNSPacket(msg);
|
|
if (parsed.questions[0].domain === nxdomain) {
|
|
return;
|
|
}
|
|
assert.strictEqual(parsed.questions[0].domain, domain);
|
|
server.send(dnstools.writeDNSPacket({
|
|
id: parsed.id,
|
|
questions: parsed.questions,
|
|
answers: answers,
|
|
}), port, address);
|
|
}), 1);
|
|
|
|
server.bind(0, common.mustCall(async () => {
|
|
const address = server.address();
|
|
// Test if the Resolver works as before.
|
|
const resolver = new dns.promises.Resolver({ timeout: 1000, tries: 1, maxTimeout: 1000 });
|
|
resolver.setServers([`127.0.0.1:${address.port}`]);
|
|
const res = await resolver.resolveAny('example.org');
|
|
assert.strictEqual(res.length, 1);
|
|
assert.strictEqual(res.length, answers.length);
|
|
assert.strictEqual(res[0].address, answers[0].address);
|
|
|
|
// Test that maxTimeout is effective.
|
|
// Without maxTimeout, the timeout will keep increasing when retrying.
|
|
const timeout1 = await timeout(address, { timeout: 500, tries: 3 });
|
|
// With maxTimeout, the timeout will always be 500 when retrying.
|
|
const timeout2 = await timeout(address, { timeout: 500, tries: 3, maxTimeout: 500 });
|
|
console.log(`timeout1: ${timeout1}, timeout2: ${timeout2}`);
|
|
assert.strictEqual(timeout1 !== undefined && timeout2 !== undefined, true);
|
|
assert.strictEqual(timeout1 > timeout2, true);
|
|
server.close();
|
|
}));
|
|
|
|
async function timeout(address, options) {
|
|
const start = Date.now();
|
|
const resolver = new dns.promises.Resolver(options);
|
|
resolver.setServers([`127.0.0.1:${address.port}`]);
|
|
try {
|
|
await resolver.resolveAny(nxdomain);
|
|
} catch (e) {
|
|
assert.strictEqual(e.code, 'ETIMEOUT');
|
|
return Date.now() - start;
|
|
}
|
|
}
|