Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
DNS: Support NAPTR queries
Browse files Browse the repository at this point in the history
Adding support for NAPTR records
fixes #3170
  • Loading branch information
ssuda authored and isaacs committed Jun 16, 2012
1 parent 3a5798b commit 91bf18f
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/dns.js
Expand Up @@ -169,6 +169,7 @@ exports.resolveMx = resolveMap.MX = resolver('queryMx');
exports.resolveNs = resolveMap.NS = resolver('queryNs');
exports.resolveTxt = resolveMap.TXT = resolver('queryTxt');
exports.resolveSrv = resolveMap.SRV = resolver('querySrv');
exports.resolveNaptr = resolveMap.NAPTR = resolver('queryNaptr');
exports.reverse = resolveMap.PTR = resolver('getHostByAddr');


Expand Down
56 changes: 56 additions & 0 deletions src/cares_wrap.cc
Expand Up @@ -485,6 +485,61 @@ 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(naptr_current->flags));
naptr_record->Set(service_symbol, String::New(naptr_current->service));
naptr_record->Set(regexp_symbol, String::New(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:
Expand Down Expand Up @@ -746,6 +801,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>);

Expand Down
24 changes: 24 additions & 0 deletions test/internet/test-dns.js
Expand Up @@ -219,6 +219,30 @@ TEST(function test_resolveSrv(done) {
checkWrap(req);
});

TEST(function test_resolveNaptr(done) {
var req = dns.resolveNaptr('sip.voice.google.com', function(err, result) {
if (err) throw err;

assert.ok(result.length > 0);

for (var i = 0; i < result.length; i++) {
var item = result[i];
assert.ok(item);
assert.ok(typeof item === 'object');

assert.ok(typeof item.flags === 'string');
assert.ok(typeof item.service === 'string');
assert.ok(typeof item.regexp === 'string');
assert.ok(typeof item.replacement === 'string');
assert.ok(typeof item.order === 'number');
assert.ok(typeof item.preference === 'number');
}

done();
});

checkWrap(req);
});

TEST(function test_resolveCname(done) {
var req = dns.resolveCname('www.google.com', function(err, names) {
Expand Down

0 comments on commit 91bf18f

Please sign in to comment.