@@ -594,22 +594,28 @@ void ChannelWrap::EnsureServers() {
594594 Setup ();
595595}
596596
597+ typedef void ares_function (ares_channel channel,
598+ const char * name,
599+ int dnsclass,
600+ int type,
601+ ares_callback callback,
602+ void * arg);
597603
598604class QueryWrap : public AsyncWrap {
599605 public:
600- QueryWrap (ChannelWrap* channel, Local<Object> req_wrap_obj, const char * name)
606+ QueryWrap (ChannelWrap* channel, Local<Object> req_wrap_obj,
607+ const char * name, ares_function* fn)
601608 : AsyncWrap(channel->env (), req_wrap_obj, AsyncWrap::PROVIDER_QUERYWRAP),
602609 channel_(channel),
603- trace_name_(name) {
610+ trace_name_(name),
611+ function_(fn) {
604612 // Make sure the channel object stays alive during the query lifetime.
605613 req_wrap_obj->Set (env ()->context (),
606614 env ()->channel_string (),
607615 channel->object ()).FromJust ();
608616 }
609617
610- ~QueryWrap () override {
611- CHECK_EQ (false , persistent ().IsEmpty ());
612- }
618+ ~QueryWrap () override { CHECK_EQ (false , persistent ().IsEmpty ()); }
613619
614620 // Subclasses should implement the appropriate Send method.
615621 virtual int Send (const char * name) {
@@ -630,8 +636,12 @@ class QueryWrap : public AsyncWrap {
630636 TRACE_EVENT_NESTABLE_ASYNC_BEGIN1 (
631637 TRACING_CATEGORY_NODE2 (dns, native), trace_name_, this ,
632638 " name" , TRACE_STR_COPY (name));
633- ares_query (channel_->cares_channel (), name, dnsclass, type, Callback,
634- static_cast <void *>(this ));
639+ function_ (channel_->cares_channel (),
640+ name,
641+ dnsclass,
642+ type,
643+ Callback,
644+ static_cast <void *>(this ));
635645 }
636646
637647 static void CaresAsyncClose (uv_async_t * async) {
@@ -757,9 +767,9 @@ class QueryWrap : public AsyncWrap {
757767
758768 private:
759769 const char * trace_name_;
770+ ares_function* function_;
760771};
761772
762-
763773template <typename T>
764774Local<Array> AddrTTLToArray (Environment* env,
765775 const T* addrttls,
@@ -1186,9 +1196,10 @@ int ParseSoaReply(Environment* env,
11861196
11871197class QueryAnyWrap : public QueryWrap {
11881198 public:
1189- QueryAnyWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1190- : QueryWrap(channel, req_wrap_obj, " resolveAny" ) {
1191- }
1199+ QueryAnyWrap (ChannelWrap* channel,
1200+ Local<Object> req_wrap_obj,
1201+ ares_function* fn)
1202+ : QueryWrap(channel, req_wrap_obj, " resolveAny" , fn) {}
11921203
11931204 int Send (const char * name) override {
11941205 AresQuery (name, ns_c_in, ns_t_any);
@@ -1364,12 +1375,12 @@ class QueryAnyWrap: public QueryWrap {
13641375 }
13651376};
13661377
1367-
13681378class QueryAWrap : public QueryWrap {
13691379 public:
1370- QueryAWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1371- : QueryWrap(channel, req_wrap_obj, " resolve4" ) {
1372- }
1380+ QueryAWrap (ChannelWrap* channel,
1381+ Local<Object> req_wrap_obj,
1382+ ares_function* fn)
1383+ : QueryWrap(channel, req_wrap_obj, " resolve4" , fn) {}
13731384
13741385 int Send (const char * name) override {
13751386 AresQuery (name, ns_c_in, ns_t_a);
@@ -1415,9 +1426,10 @@ class QueryAWrap: public QueryWrap {
14151426
14161427class QueryAaaaWrap : public QueryWrap {
14171428 public:
1418- QueryAaaaWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1419- : QueryWrap(channel, req_wrap_obj, " resolve6" ) {
1420- }
1429+ QueryAaaaWrap (ChannelWrap* channel,
1430+ Local<Object> req_wrap_obj,
1431+ ares_function* fn)
1432+ : QueryWrap(channel, req_wrap_obj, " resolve6" , fn) {}
14211433
14221434 int Send (const char * name) override {
14231435 AresQuery (name, ns_c_in, ns_t_aaaa);
@@ -1460,12 +1472,12 @@ class QueryAaaaWrap: public QueryWrap {
14601472 }
14611473};
14621474
1463-
14641475class QueryCnameWrap : public QueryWrap {
14651476 public:
1466- QueryCnameWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1467- : QueryWrap(channel, req_wrap_obj, " resolveCname" ) {
1468- }
1477+ QueryCnameWrap (ChannelWrap* channel,
1478+ Local<Object> req_wrap_obj,
1479+ ares_function* fn)
1480+ : QueryWrap(channel, req_wrap_obj, " resolveCname" , fn) {}
14691481
14701482 int Send (const char * name) override {
14711483 AresQuery (name, ns_c_in, ns_t_cname);
@@ -1498,9 +1510,10 @@ class QueryCnameWrap: public QueryWrap {
14981510
14991511class QueryMxWrap : public QueryWrap {
15001512 public:
1501- QueryMxWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1502- : QueryWrap(channel, req_wrap_obj, " resolveMx" ) {
1503- }
1513+ QueryMxWrap (ChannelWrap* channel,
1514+ Local<Object> req_wrap_obj,
1515+ ares_function* fn)
1516+ : QueryWrap(channel, req_wrap_obj, " resolveMx" , fn) {}
15041517
15051518 int Send (const char * name) override {
15061519 AresQuery (name, ns_c_in, ns_t_mx);
@@ -1533,9 +1546,10 @@ class QueryMxWrap: public QueryWrap {
15331546
15341547class QueryNsWrap : public QueryWrap {
15351548 public:
1536- QueryNsWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1537- : QueryWrap(channel, req_wrap_obj, " resolveNs" ) {
1538- }
1549+ QueryNsWrap (ChannelWrap* channel,
1550+ Local<Object> req_wrap_obj,
1551+ ares_function* fn)
1552+ : QueryWrap(channel, req_wrap_obj, " resolveNs" , fn) {}
15391553
15401554 int Send (const char * name) override {
15411555 AresQuery (name, ns_c_in, ns_t_ns);
@@ -1568,9 +1582,10 @@ class QueryNsWrap: public QueryWrap {
15681582
15691583class QueryTxtWrap : public QueryWrap {
15701584 public:
1571- QueryTxtWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1572- : QueryWrap(channel, req_wrap_obj, " resolveTxt" ) {
1573- }
1585+ QueryTxtWrap (ChannelWrap* channel,
1586+ Local<Object> req_wrap_obj,
1587+ ares_function* fn)
1588+ : QueryWrap(channel, req_wrap_obj, " resolveTxt" , fn) {}
15741589
15751590 int Send (const char * name) override {
15761591 AresQuery (name, ns_c_in, ns_t_txt);
@@ -1602,9 +1617,10 @@ class QueryTxtWrap: public QueryWrap {
16021617
16031618class QuerySrvWrap : public QueryWrap {
16041619 public:
1605- explicit QuerySrvWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1606- : QueryWrap(channel, req_wrap_obj, " resolveSrv" ) {
1607- }
1620+ explicit QuerySrvWrap (ChannelWrap* channel,
1621+ Local<Object> req_wrap_obj,
1622+ ares_function* fn)
1623+ : QueryWrap(channel, req_wrap_obj, " resolveSrv" , fn) {}
16081624
16091625 int Send (const char * name) override {
16101626 AresQuery (name, ns_c_in, ns_t_srv);
@@ -1635,9 +1651,10 @@ class QuerySrvWrap: public QueryWrap {
16351651
16361652class QueryPtrWrap : public QueryWrap {
16371653 public:
1638- explicit QueryPtrWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1639- : QueryWrap(channel, req_wrap_obj, " resolvePtr" ) {
1640- }
1654+ explicit QueryPtrWrap (ChannelWrap* channel,
1655+ Local<Object> req_wrap_obj,
1656+ ares_function* fn)
1657+ : QueryWrap(channel, req_wrap_obj, " resolvePtr" , fn) {}
16411658
16421659 int Send (const char * name) override {
16431660 AresQuery (name, ns_c_in, ns_t_ptr);
@@ -1670,9 +1687,10 @@ class QueryPtrWrap: public QueryWrap {
16701687
16711688class QueryNaptrWrap : public QueryWrap {
16721689 public:
1673- explicit QueryNaptrWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1674- : QueryWrap(channel, req_wrap_obj, " resolveNaptr" ) {
1675- }
1690+ explicit QueryNaptrWrap (ChannelWrap* channel,
1691+ Local<Object> req_wrap_obj,
1692+ ares_function* fn)
1693+ : QueryWrap(channel, req_wrap_obj, " resolveNaptr" , fn) {}
16761694
16771695 int Send (const char * name) override {
16781696 AresQuery (name, ns_c_in, ns_t_naptr);
@@ -1704,9 +1722,10 @@ class QueryNaptrWrap: public QueryWrap {
17041722
17051723class QuerySoaWrap : public QueryWrap {
17061724 public:
1707- QuerySoaWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1708- : QueryWrap(channel, req_wrap_obj, " resolveSoa" ) {
1709- }
1725+ QuerySoaWrap (ChannelWrap* channel,
1726+ Local<Object> req_wrap_obj,
1727+ ares_function* fn)
1728+ : QueryWrap(channel, req_wrap_obj, " resolveSoa" , fn) {}
17101729
17111730 int Send (const char * name) override {
17121731 AresQuery (name, ns_c_in, ns_t_soa);
@@ -1769,9 +1788,10 @@ class QuerySoaWrap: public QueryWrap {
17691788
17701789class GetHostByAddrWrap : public QueryWrap {
17711790 public:
1772- explicit GetHostByAddrWrap (ChannelWrap* channel, Local<Object> req_wrap_obj)
1773- : QueryWrap(channel, req_wrap_obj, " reverse" ) {
1774- }
1791+ explicit GetHostByAddrWrap (ChannelWrap* channel,
1792+ Local<Object> req_wrap_obj,
1793+ ares_function* fn)
1794+ : QueryWrap(channel, req_wrap_obj, " reverse" , fn) {}
17751795
17761796 int Send (const char * name) override {
17771797 int length, family;
@@ -1825,10 +1845,14 @@ static void Query(const FunctionCallbackInfo<Value>& args) {
18251845 CHECK_EQ (false , args.IsConstructCall ());
18261846 CHECK (args[0 ]->IsObject ());
18271847 CHECK (args[1 ]->IsString ());
1848+ CHECK (args[2 ]->IsBoolean ());
18281849
18291850 Local<Object> req_wrap_obj = args[0 ].As <Object>();
18301851 Local<String> string = args[1 ].As <String>();
1831- Wrap* wrap = new Wrap (channel, req_wrap_obj);
1852+ bool is_search = args[2 ]->IsTrue ();
1853+ ares_function* ares_fn_ = ares_query;
1854+ if (is_search) ares_fn_ = ares_search;
1855+ Wrap* wrap = new Wrap (channel, req_wrap_obj, ares_fn_);
18321856
18331857 node::Utf8Value name (env->isolate (), string);
18341858 channel->ModifyActivityQueryCount (1 );
0 commit comments