diff options
-rw-r--r-- | doc/api/dns.md | 2 | ||||
-rw-r--r-- | lib/dns.js | 1 | ||||
-rw-r--r-- | lib/internal/dns/utils.js | 8 | ||||
-rw-r--r-- | src/cares_wrap.cc | 3 | ||||
-rw-r--r-- | test/parallel/test-dns.js | 25 | ||||
-rw-r--r-- | test/parallel/test-net-connect-options-port.js | 2 | ||||
-rw-r--r-- | test/parallel/test-tls-connect-hints-option.js | 4 |
7 files changed, 35 insertions, 10 deletions
diff --git a/doc/api/dns.md b/doc/api/dns.md index cea7db52f9b..f854445b14d 100644 --- a/doc/api/dns.md +++ b/doc/api/dns.md @@ -210,6 +210,8 @@ configured. Loopback addresses are not considered. * `dns.V4MAPPED`: If the IPv6 family was specified, but no IPv6 addresses were found, then return IPv4 mapped IPv6 addresses. It is not supported on some operating systems (e.g FreeBSD 10.1). +* `dns.ALL`: If `dns.V4MAPPED` is specified, return resolved IPv6 addresses as +well as IPv4 mapped IPv6 addresses. ## `dns.lookupService(address, port, callback)` <!-- YAML diff --git a/lib/dns.js b/lib/dns.js index e33dd2620e1..bd330ba92bc 100644 --- a/lib/dns.js +++ b/lib/dns.js @@ -290,6 +290,7 @@ module.exports = { // uv_getaddrinfo flags ADDRCONFIG: cares.AI_ADDRCONFIG, + ALL: cares.AI_ALL, V4MAPPED: cares.AI_V4MAPPED, // ERROR CODES diff --git a/lib/internal/dns/utils.js b/lib/internal/dns/utils.js index 18ad6bfad7a..93aa529a733 100644 --- a/lib/internal/dns/utils.js +++ b/lib/internal/dns/utils.js @@ -10,7 +10,8 @@ const { ChannelWrap, strerror, AI_ADDRCONFIG, - AI_V4MAPPED + AI_ALL, + AI_V4MAPPED, } = internalBinding('cares_wrap'); const IANA_DNS_PORT = 53; const IPv6RE = /^\[([^[\]]*)\]/; @@ -136,10 +137,7 @@ function bindDefaultResolver(target, source) { } function validateHints(hints) { - if (hints !== 0 && - hints !== AI_ADDRCONFIG && - hints !== AI_V4MAPPED && - hints !== (AI_ADDRCONFIG | AI_V4MAPPED)) { + if ((hints & ~(AI_ADDRCONFIG | AI_ALL | AI_V4MAPPED)) !== 0) { throw new ERR_INVALID_OPT_VALUE('hints', hints); } } diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 71d8f8569ba..ff050cc2dc9 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -2189,6 +2189,9 @@ void Initialize(Local<Object> target, "AI_ADDRCONFIG"), Integer::New(env->isolate(), AI_ADDRCONFIG)).Check(); target->Set(env->context(), FIXED_ONE_BYTE_STRING(env->isolate(), + "AI_ALL"), + Integer::New(env->isolate(), AI_ALL)).Check(); + target->Set(env->context(), FIXED_ONE_BYTE_STRING(env->isolate(), "AI_V4MAPPED"), Integer::New(env->isolate(), AI_V4MAPPED)).Check(); diff --git a/test/parallel/test-dns.js b/test/parallel/test-dns.js index 0ce318bcd41..0d9d267bac7 100644 --- a/test/parallel/test-dns.js +++ b/test/parallel/test-dns.js @@ -209,14 +209,14 @@ assert.deepStrictEqual(dns.getServers(), []); { /* * Make sure that dns.lookup throws if hints does not represent a valid flag. - * (dns.V4MAPPED | dns.ADDRCONFIG) + 1 is invalid because: - * - it's different from dns.V4MAPPED and dns.ADDRCONFIG. - * - it's different from them bitwise ored. + * (dns.V4MAPPED | dns.ADDRCONFIG | dns.ALL) + 1 is invalid because: + * - it's different from dns.V4MAPPED and dns.ADDRCONFIG and dns.ALL. + * - it's different from any subset of them bitwise ored. * - it's different from 0. * - it's an odd number different than 1, and thus is invalid, because * flags are either === 1 or even. */ - const hints = (dns.V4MAPPED | dns.ADDRCONFIG) + 1; + const hints = (dns.V4MAPPED | dns.ADDRCONFIG | dns.ALL) + 1; const err = { code: 'ERR_INVALID_OPT_VALUE', name: 'TypeError', @@ -254,11 +254,28 @@ dns.lookup('', { hints: dns.ADDRCONFIG | dns.V4MAPPED }, common.mustCall()); +dns.lookup('', { + hints: dns.ALL +}, common.mustCall()); + +dns.lookup('', { + hints: dns.V4MAPPED | dns.ALL +}, common.mustCall()); + +dns.lookup('', { + hints: dns.ADDRCONFIG | dns.V4MAPPED | dns.ALL +}, common.mustCall()); + (async function() { await dnsPromises.lookup('', { family: 4, hints: 0 }); await dnsPromises.lookup('', { family: 6, hints: dns.ADDRCONFIG }); await dnsPromises.lookup('', { hints: dns.V4MAPPED }); await dnsPromises.lookup('', { hints: dns.ADDRCONFIG | dns.V4MAPPED }); + await dnsPromises.lookup('', { hints: dns.ALL }); + await dnsPromises.lookup('', { hints: dns.V4MAPPED | dns.ALL }); + await dnsPromises.lookup('', { + hints: dns.ADDRCONFIG | dns.V4MAPPED | dns.ALL + }); })(); { diff --git a/test/parallel/test-net-connect-options-port.js b/test/parallel/test-net-connect-options-port.js index 88e626354ed..91598f5f15a 100644 --- a/test/parallel/test-net-connect-options-port.js +++ b/test/parallel/test-net-connect-options-port.js @@ -59,7 +59,7 @@ const net = require('net'); // Test invalid hints { // connect({hint}, cb) and connect({hint}) - const hints = (dns.ADDRCONFIG | dns.V4MAPPED) + 42; + const hints = (dns.ADDRCONFIG | dns.V4MAPPED | dns.ALL) + 42; const hintOptBlocks = doConnect([{ hints }], () => common.mustNotCall()); for (const fn of hintOptBlocks) { diff --git a/test/parallel/test-tls-connect-hints-option.js b/test/parallel/test-tls-connect-hints-option.js index fd155c9659a..3f58266ac88 100644 --- a/test/parallel/test-tls-connect-hints-option.js +++ b/test/parallel/test-tls-connect-hints-option.js @@ -15,7 +15,11 @@ const hints = 512; assert.notStrictEqual(hints, dns.ADDRCONFIG); assert.notStrictEqual(hints, dns.V4MAPPED); +assert.notStrictEqual(hints, dns.ALL); assert.notStrictEqual(hints, dns.ADDRCONFIG | dns.V4MAPPED); +assert.notStrictEqual(hints, dns.ADDRCONFIG | dns.ALL); +assert.notStrictEqual(hints, dns.V4MAPPED | dns.ALL); +assert.notStrictEqual(hints, dns.ADDRCONFIG | dns.V4MAPPED | dns.ALL); tls.connect({ lookup: common.mustCall((host, options) => { |