node/test/parallel/test-dns-resolvesrv.js
notvivek12 8c323899ff
dns: fix Windows SRV ECONNREFUSED by adjusting c-ares fallback detection
Newer c-ares versions set tcp_port/udp_port to 53 instead of 0,
which caused the loopback detection to fail. This fix:

- Removes the port check from loopback detection
- Adds IPv6 loopback (::1) support
- Calls EnsureServers() before each DNS query

PR-URL: https://github.com/nodejs/node/pull/61453
Reviewed-By: Anna Henningsen <anna@addaleax.net>
2026-02-04 23:07:19 +08:00

102 lines
2.8 KiB
JavaScript

'use strict';
// Regression test for dns.resolveSrv() functionality.
// This test ensures SRV record resolution works correctly, which is
// critical for services like MongoDB Atlas that use SRV records for
// connection discovery (mongodb+srv:// URIs).
//
// Related issue: dns.resolveSrv() returning ECONNREFUSED instead of
// properly resolving SRV records.
const common = require('../common');
const dnstools = require('../common/dns');
const dns = require('dns');
const dnsPromises = dns.promises;
const assert = require('assert');
const dgram = require('dgram');
const srvRecords = [
{
type: 'SRV',
name: 'server1.example.org',
port: 27017,
priority: 0,
weight: 5,
ttl: 300,
},
{
type: 'SRV',
name: 'server2.example.org',
port: 27017,
priority: 0,
weight: 5,
ttl: 300,
},
{
type: 'SRV',
name: 'server3.example.org',
port: 27017,
priority: 1,
weight: 10,
ttl: 300,
},
];
const server = dgram.createSocket('udp4');
server.on('message', common.mustCall((msg, { address, port }) => {
const parsed = dnstools.parseDNSPacket(msg);
const domain = parsed.questions[0].domain;
assert.strictEqual(domain, '_mongodb._tcp.cluster0.example.org');
server.send(dnstools.writeDNSPacket({
id: parsed.id,
questions: parsed.questions,
answers: srvRecords.map((record) => Object.assign({ domain }, record)),
}), port, address);
}, 2)); // Called twice: once for callback, once for promises
server.bind(0, common.mustCall(async () => {
const address = server.address();
const resolver = new dns.Resolver();
const resolverPromises = new dnsPromises.Resolver();
resolver.setServers([`127.0.0.1:${address.port}`]);
resolverPromises.setServers([`127.0.0.1:${address.port}`]);
function validateResult(result) {
assert.ok(Array.isArray(result), 'Result should be an array');
assert.strictEqual(result.length, 3);
for (const record of result) {
assert.strictEqual(typeof record, 'object');
assert.strictEqual(typeof record.name, 'string');
assert.strictEqual(typeof record.port, 'number');
assert.strictEqual(typeof record.priority, 'number');
assert.strictEqual(typeof record.weight, 'number');
assert.strictEqual(record.port, 27017);
}
// Verify we got all expected server names
const names = result.map((r) => r.name).sort();
assert.deepStrictEqual(names, [
'server1.example.org',
'server2.example.org',
'server3.example.org',
]);
}
// Test promises API
const promiseResult = await resolverPromises.resolveSrv(
'_mongodb._tcp.cluster0.example.org'
);
validateResult(promiseResult);
// Test callback API
resolver.resolveSrv(
'_mongodb._tcp.cluster0.example.org',
common.mustSucceed((result) => {
validateResult(result);
server.close();
})
);
}));