From 1cb1a845effb3cc2cc8021be1668e03986b8b1b6 Mon Sep 17 00:00:00 2001 From: XadillaX Date: Sun, 21 May 2017 18:02:33 +0800 Subject: [PATCH] dns: add resolveAny support `dns.resolveAny` and `dns.resolve` with `"ANY"` has the similar behavior like `$ dig any` and returns an array with several types of records. `dns.resolveAny` parses the result packet by several rules in turn. Supported types: * A * AAAA * CNAME * MX * NAPTR * NS * PTR * SOA * SRV * TXT Fixes: https://github.com/nodejs/node/issues/2848 PR-URL: https://github.com/nodejs/node/pull/13137 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Roman Reiss --- doc/api/dns.md | 47 ++ lib/dns.js | 2 + src/cares_wrap.cc | 889 +++++++++++++++++++++++++++------- src/env.h | 13 + test/internet/test-dns-any.js | 198 ++++++++ 5 files changed, 975 insertions(+), 174 deletions(-) create mode 100644 test/internet/test-dns-any.js diff --git a/doc/api/dns.md b/doc/api/dns.md index c41c886034d7ba..3813712305abe8 100644 --- a/doc/api/dns.md +++ b/doc/api/dns.md @@ -210,6 +210,7 @@ records. The type and structure of individual results varies based on `rrtype`: | `'SOA'` | start of authority records | {Object} | [`dns.resolveSoa()`][] | | `'SRV'` | service records | {Object} | [`dns.resolveSrv()`][] | | `'TXT'` | text records | {string} | [`dns.resolveTxt()`][] | +| `'ANY'` | any records | {Object} | [`dns.resolveAny()`][] | On error, `err` is an [`Error`][] object, where `err.code` is one of the [DNS error codes](#dns_error_codes). @@ -430,6 +431,51 @@ is a two-dimensional array of the text records available for `hostname` (e.g., one record. Depending on the use case, these could be either joined together or treated separately. +## dns.resolveAny(hostname, callback) + +- `hostname` {string} +- `callback` {Function} + - `err` {Error} + - `ret` {Object[][]} + +Uses the DNS protocol to resolve all records (also known as `ANY` or `*` query). +The `ret` argument passed to the `callback` function will be an array containing +various types of records. Each object has a property `type` that indicates the +type of the current record. And depending on the `type`, additional properties +will be present on the object: + +| Type | Properties | +|------|------------| +| `"A"` | `address` / `ttl` | +| `"AAAA"` | `address` / `ttl` | +| `"CNAME"` | `value` | +| `"MX"` | Refer to [`dns.resolveMx()`][] | +| `"NAPTR"` | Refer to [`dns.resolveNaptr()`][] | +| `"NS"` | `value` | +| `"PTR"` | `value` | +| `"SOA"` | Refer to [`dns.resolveSoa()`][] | +| `"SRV"` | Refer to [`dns.resolveSrv()`][] | +| `"TXT"` | This type of record contains an array property called `entries` which refers to [`dns.resolveTxt()`][], eg. `{ entries: ['...'], type: 'TXT' }` | + +Here is a example of the `ret` object passed to the callback: + + +```js +[ { type: 'A', address: '127.0.0.1', ttl: 299 }, + { type: 'CNAME', value: 'example.com' }, + { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 }, + { type: 'NS', value: 'ns1.example.com', type: 'NS' }, + { type: 'TXT', entries: [ 'v=spf1 include:_spf.example.com ~all' ] }, + { type: 'SOA', + nsname: 'ns1.example.com', + hostmaster: 'admin.example.com', + serial: 156696742, + refresh: 900, + retry: 900, + expire: 1800, + minttl: 60 } ] +``` + ## dns.reverse(ip, callback)