diff options
author | Pavel Lang <langpavel@phpskelet.org> | 2012-09-18 11:21:38 +0200 |
---|---|---|
committer | Fedor Indutny <fedor.indutny@gmail.com> | 2013-03-06 14:31:22 +0400 |
commit | 2ad98725d632d76bda1d668dce050409f103cc0d (patch) | |
tree | d193046ca2b0c95f55ecc19bb01e3af25ec781eb /src | |
parent | 74784b63d627d3988234399de074d3bee5bf23f6 (diff) | |
download | node-2ad98725d632d76bda1d668dce050409f103cc0d.tar.gz |
DNS: Support NAPTR queries
They were previously removed in a90bc78534d94940a6b726c01cf8427c296b4c63.
Diffstat (limited to 'src')
-rw-r--r-- | src/cares_wrap.cc | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 22c7ec497..b7ba82870 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -609,6 +609,66 @@ class QuerySrvWrap: public QueryWrap { } }; +class QueryNaptrWrap: public QueryWrap { + public: + int Send(const char* name) { + ares_query(ares_channel, + name, + ns_c_in, + ns_t_naptr, + Callback, + GetQueryArg()); + return 0; + } + + protected: + void Parse(unsigned char* buf, int len) { + HandleScope scope; + + ares_naptr_reply* naptr_start; + int status = ares_parse_naptr_reply(buf, len, &naptr_start); + + if (status != ARES_SUCCESS) { + this->ParseError(status); + return; + } + + Local<Array> naptr_records = Array::New(); + Local<String> flags_symbol = String::NewSymbol("flags"); + Local<String> service_symbol = String::NewSymbol("service"); + Local<String> regexp_symbol = String::NewSymbol("regexp"); + Local<String> replacement_symbol = String::NewSymbol("replacement"); + Local<String> order_symbol = String::NewSymbol("order"); + Local<String> preference_symbol = String::NewSymbol("preference"); + + int i = 0; + for (ares_naptr_reply* naptr_current = naptr_start; + naptr_current; + naptr_current = naptr_current->next) { + + Local<Object> naptr_record = Object::New(); + + naptr_record->Set(flags_symbol, + String::New(reinterpret_cast<char*>(naptr_current->flags))); + naptr_record->Set(service_symbol, + String::New(reinterpret_cast<char*>(naptr_current->service))); + naptr_record->Set(regexp_symbol, + String::New(reinterpret_cast<char*>(naptr_current->regexp))); + naptr_record->Set(replacement_symbol, + String::New(naptr_current->replacement)); + naptr_record->Set(order_symbol, Integer::New(naptr_current->order)); + naptr_record->Set(preference_symbol, + Integer::New(naptr_current->preference)); + + naptr_records->Set(Integer::New(i++), naptr_record); + } + + ares_free_data(naptr_start); + + this->CallOnComplete(naptr_records); + } +}; + class GetHostByAddrWrap: public QueryWrap { public: @@ -908,6 +968,7 @@ static void Initialize(Handle<Object> target) { NODE_SET_METHOD(target, "queryNs", Query<QueryNsWrap>); NODE_SET_METHOD(target, "queryTxt", Query<QueryTxtWrap>); NODE_SET_METHOD(target, "querySrv", Query<QuerySrvWrap>); + NODE_SET_METHOD(target, "queryNaptr", Query<QueryNaptrWrap>); NODE_SET_METHOD(target, "getHostByAddr", Query<GetHostByAddrWrap>); NODE_SET_METHOD(target, "getHostByName", QueryWithFamily<GetHostByNameWrap>); |