diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2016-10-26 07:51:34 +0200 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2016-11-18 22:01:11 +0100 |
commit | c31b507b947d5b4803dd96a7c9a09fd2112085ab (patch) | |
tree | 163b80cab3cbf989ccd9aed15cea0f024c67abc5 /src/cares_wrap.cc | |
parent | b80f05efaafdb8b4f0ef6afc92bfb31762904e02 (diff) | |
download | android-node-v8-c31b507b947d5b4803dd96a7c9a09fd2112085ab.tar.gz android-node-v8-c31b507b947d5b4803dd96a7c9a09fd2112085ab.tar.bz2 android-node-v8-c31b507b947d5b4803dd96a7c9a09fd2112085ab.zip |
dns: implement {ttl: true} for dns.resolve4()
Add an option to retrieve the Time-To-Live of the A record.
PR-URL: https://github.com/nodejs/node/pull/9296
Refs: https://github.com/nodejs/node/issues/5893
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Roman Reiss <me@silverwind.io>
Diffstat (limited to 'src/cares_wrap.cc')
-rw-r--r-- | src/cares_wrap.cc | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 492e151832..4b9ba26fe4 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -336,25 +336,17 @@ class QueryWrap : public AsyncWrap { delete wrap; } - void CallOnComplete(Local<Value> answer) { - HandleScope handle_scope(env()->isolate()); - Context::Scope context_scope(env()->context()); - Local<Value> argv[] = { - Integer::New(env()->isolate(), 0), - answer - }; - MakeCallback(env()->oncomplete_string(), arraysize(argv), argv); - } - - void CallOnComplete(Local<Value> answer, Local<Value> family) { + void CallOnComplete(Local<Value> answer, + Local<Value> extra = Local<Value>()) { HandleScope handle_scope(env()->isolate()); Context::Scope context_scope(env()->context()); Local<Value> argv[] = { Integer::New(env()->isolate(), 0), answer, - family + extra }; - MakeCallback(env()->oncomplete_string(), arraysize(argv), argv); + const int argc = arraysize(argv) - extra.IsEmpty(); + MakeCallback(env()->oncomplete_string(), argc, argv); } void ParseError(int status) { @@ -400,18 +392,27 @@ class QueryAWrap: public QueryWrap { HandleScope handle_scope(env()->isolate()); Context::Scope context_scope(env()->context()); - struct hostent* host; + hostent* host; + ares_addrttl addrttls[256]; + int naddrttls = arraysize(addrttls); - int status = ares_parse_a_reply(buf, len, &host, nullptr, nullptr); + int status = ares_parse_a_reply(buf, len, &host, addrttls, &naddrttls); if (status != ARES_SUCCESS) { ParseError(status); return; } Local<Array> addresses = HostentToAddresses(env(), host); + Local<Array> ttls = Array::New(env()->isolate(), naddrttls); + + auto context = env()->context(); + for (int i = 0; i < naddrttls; i += 1) { + auto value = Integer::New(env()->isolate(), addrttls[i].ttl); + ttls->Set(context, i, value).FromJust(); + } ares_free_hostent(host); - this->CallOnComplete(addresses); + CallOnComplete(addresses, ttls); } }; |