• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2const common = require('../common');
3const dnstools = require('../common/dns');
4const dns = require('dns');
5const assert = require('assert');
6const dgram = require('dgram');
7const dnsPromises = dns.promises;
8
9const server = dgram.createSocket('udp4');
10const resolver = new dns.Resolver({ timeout: 100, tries: 1 });
11const resolverPromises = new dnsPromises.Resolver({ timeout: 100, tries: 1 });
12
13server.on('message', common.mustCall((msg, { address, port }) => {
14  const parsed = dnstools.parseDNSPacket(msg);
15  const domain = parsed.questions[0].domain;
16  assert.strictEqual(domain, 'example.org');
17
18  const buf = dnstools.writeDNSPacket({
19    id: parsed.id,
20    questions: parsed.questions,
21    answers: { type: 'A', address: '1.2.3.4', ttl: 123, domain },
22  });
23  // Overwrite the # of answers with 2, which is incorrect. The response is
24  // discarded in c-ares >= 1.21.0. This is the reason why a small timeout is
25  // used in the `Resolver` constructor. See
26  // https://github.com/nodejs/node/pull/50743#issue-1994909204
27  buf.writeUInt16LE(2, 6);
28  server.send(buf, port, address);
29}, 2));
30
31server.bind(0, common.mustCall(async () => {
32  const address = server.address();
33  resolver.setServers([`127.0.0.1:${address.port}`]);
34  resolverPromises.setServers([`127.0.0.1:${address.port}`]);
35
36  resolverPromises.resolveAny('example.org')
37    .then(common.mustNotCall())
38    .catch(common.expectsError({
39      // May return EBADRESP or ETIMEOUT
40      code: /^(?:EBADRESP|ETIMEOUT)$/,
41      syscall: 'queryAny',
42      hostname: 'example.org'
43    }));
44
45  resolver.resolveAny('example.org', common.mustCall((err) => {
46    assert.notStrictEqual(err.code, 'SUCCESS');
47    assert.strictEqual(err.syscall, 'queryAny');
48    assert.strictEqual(err.hostname, 'example.org');
49    const descriptor = Object.getOwnPropertyDescriptor(err, 'message');
50    // The error message should be non-enumerable.
51    assert.strictEqual(descriptor.enumerable, false);
52    server.close();
53  }));
54}));
55