GeezerVison is showing github.com — dns: implement {ttl: true} for dns.resolve4() · nodejs/node@1bd7936
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: doc/api/dns.md +8-1Lines changed: 8 additions & 1 deletion - Display the source diff
- Display the rich diff
| Original file line number | Diff line number | Diff line change |
|---|
@@ -183,7 +183,7 @@ corresponding lookup methods. | 183 | 183 | On error, `err` is an [`Error`][] object, where `err.code` is | 184 | 184 | one of the error codes listed [here](#dns_error_codes). | 185 | 185 |
| 186 | | -## dns.resolve4(hostname, callback) | | 186 | +## dns.resolve4(hostname[, options], callback) | 187 | 187 | <!-- YAML | 188 | 188 | added: v0.1.16 | 189 | 189 | --> | @@ -193,6 +193,13 @@ Uses the DNS protocol to resolve a IPv4 addresses (`A` records) for the | 193 | 193 | will contain an array of IPv4 addresses (e.g. | 194 | 194 | `['74.125.79.104', '74.125.79.105', '74.125.79.106']`). | 195 | 195 |
| | 196 | +* `hostname` {String} Hostname to resolve. | | 197 | +* `options` {Object} | | 198 | + * `ttl` {Boolean} Retrieve the Time-To-Live value (TTL) of each record. | | 199 | + The callback receives an array of `{ address: '1.2.3.4', ttl: 60 }` objects | | 200 | + rather than an array of strings. The TTL is expressed in seconds. | | 201 | +* `callback` {Function} An `(err, result)` callback function. | | 202 | + | 196 | 203 | ## dns.resolve6(hostname, callback) | 197 | 204 | <!-- YAML | 198 | 205 | added: v0.1.16 | |
Collapse file Copy file name to clipboardExpand all lines: lib/dns.js +12-2Lines changed: 12 additions & 2 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -211,7 +211,10 @@ exports.lookupService = function lookupService(host, port, callback) { | 211 | 211 | }; | 212 | 212 |
| 213 | 213 |
| 214 | | -function onresolve(err, result) { | | 214 | +function onresolve(err, result, ttls) { | | 215 | + if (ttls && this.ttl) | | 216 | + result = result.map((address, index) => ({ address, ttl: ttls[index] })); | | 217 | + | 215 | 218 | if (err) | 216 | 219 | this.callback(errnoException(err, this.bindingName, this.hostname)); | 217 | 220 | else | @@ -222,7 +225,13 @@ function onresolve(err, result) { | 222 | 225 | function resolver(bindingName) { | 223 | 226 | var binding = cares[bindingName]; | 224 | 227 |
| 225 | | - return function query(name, callback) { | | 228 | + return function query(name, /* options, */ callback) { | | 229 | + var options; | | 230 | + if (arguments.length > 2) { | | 231 | + options = callback; | | 232 | + callback = arguments[2]; | | 233 | + } | | 234 | + | 226 | 235 | if (typeof name !== 'string') { | 227 | 236 | throw new Error('"name" argument must be a string'); | 228 | 237 | } else if (typeof callback !== 'function') { | @@ -235,6 +244,7 @@ function resolver(bindingName) { | 235 | 244 | req.callback = callback; | 236 | 245 | req.hostname = name; | 237 | 246 | req.oncomplete = onresolve; | | 247 | + req.ttl = !!(options && options.ttl); | 238 | 248 | var err = binding(req, name); | 239 | 249 | if (err) throw errnoException(err, bindingName); | 240 | 250 | callback.immediately = true; | |
Collapse file Copy file name to clipboardExpand all lines: src/cares_wrap.cc +17-16Lines changed: 17 additions & 16 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -336,25 +336,17 @@ class QueryWrap : public AsyncWrap { | 336 | 336 | delete wrap; | 337 | 337 | } | 338 | 338 |
| 339 | | - void CallOnComplete(Local<Value> answer) { | 340 | | - HandleScope handle_scope(env()->isolate()); | 341 | | - Context::Scope context_scope(env()->context()); | 342 | | - Local<Value> argv[] = { | 343 | | - Integer::New(env()->isolate(), 0), | 344 | | - answer | 345 | | - }; | 346 | | - MakeCallback(env()->oncomplete_string(), arraysize(argv), argv); | 347 | | - } | 348 | | - | 349 | | - void CallOnComplete(Local<Value> answer, Local<Value> family) { | | 339 | + void CallOnComplete(Local<Value> answer, | | 340 | + Local<Value> extra = Local<Value>()) { | 350 | 341 | HandleScope handle_scope(env()->isolate()); | 351 | 342 | Context::Scope context_scope(env()->context()); | 352 | 343 | Local<Value> argv[] = { | 353 | 344 | Integer::New(env()->isolate(), 0), | 354 | 345 | answer, | 355 | | - family | | 346 | + extra | 356 | 347 | }; | 357 | | - MakeCallback(env()->oncomplete_string(), arraysize(argv), argv); | | 348 | + const int argc = arraysize(argv) - extra.IsEmpty(); | | 349 | + MakeCallback(env()->oncomplete_string(), argc, argv); | 358 | 350 | } | 359 | 351 |
| 360 | 352 | void ParseError(int status) { | @@ -400,18 +392,27 @@ class QueryAWrap: public QueryWrap { | 400 | 392 | HandleScope handle_scope(env()->isolate()); | 401 | 393 | Context::Scope context_scope(env()->context()); | 402 | 394 |
| 403 | | - struct hostent* host; | | 395 | + hostent* host; | | 396 | + ares_addrttl addrttls[256]; | | 397 | + int naddrttls = arraysize(addrttls); | 404 | 398 |
| 405 | | - int status = ares_parse_a_reply(buf, len, &host, nullptr, nullptr); | | 399 | + int status = ares_parse_a_reply(buf, len, &host, addrttls, &naddrttls); | 406 | 400 | if (status != ARES_SUCCESS) { | 407 | 401 | ParseError(status); | 408 | 402 | return; | 409 | 403 | } | 410 | 404 |
| 411 | 405 | Local<Array> addresses = HostentToAddresses(env(), host); | | 406 | + Local<Array> ttls = Array::New(env()->isolate(), naddrttls); | | 407 | + | | 408 | + auto context = env()->context(); | | 409 | + for (int i = 0; i < naddrttls; i += 1) { | | 410 | + auto value = Integer::New(env()->isolate(), addrttls[i].ttl); | | 411 | + ttls->Set(context, i, value).FromJust(); | | 412 | + } | 412 | 413 | ares_free_hostent(host); | 413 | 414 |
| 414 | | - this->CallOnComplete(addresses); | | 415 | + CallOnComplete(addresses, ttls); | 415 | 416 | } | 416 | 417 | }; | 417 | 418 |
| |
Collapse file Copy file name to clipboardExpand all lines: test/internet/test-dns.js +20Lines changed: 20 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -60,6 +60,26 @@ TEST(function test_reverse_bogus(done) { | 60 | 60 | done(); | 61 | 61 | }); | 62 | 62 |
| | 63 | +TEST(function test_resolve4_ttl(done) { | | 64 | + var req = dns.resolve4('google.com', { ttl: true }, function(err, result) { | | 65 | + assert.ifError(err); | | 66 | + assert.ok(result.length > 0); | | 67 | + | | 68 | + for (var i = 0; i < result.length; i++) { | | 69 | + var item = result[i]; | | 70 | + assert.ok(item); | | 71 | + assert.strictEqual(typeof item, 'object'); | | 72 | + assert.strictEqual(typeof item.ttl, 'number'); | | 73 | + assert.strictEqual(typeof item.address, 'string'); | | 74 | + assert.ok(item.ttl > 0); | | 75 | + assert.ok(isIPv4(item.address)); | | 76 | + } | | 77 | + | | 78 | + done(); | | 79 | + }); | | 80 | + | | 81 | + checkWrap(req); | | 82 | +}); | 63 | 83 |
| 64 | 84 | TEST(function test_resolveMx(done) { | 65 | 85 | var req = dns.resolveMx('gmail.com', function(err, result) { | |
|