struct ares_txt_reply *next;
unsigned char *txt;
size_t length; /* length excludes null termination */
+ unsigned char record_start; /* 1 - if start of new record
+ * 0 - if a chunk in the same record */
};
struct ares_naptr_reply {
break;
}
- ++strptr;
-
/* Allocate storage for this TXT answer appending it to the list */
txt_curr = ares_malloc_data(ARES_DATATYPE_TXT_REPLY);
if (!txt_curr)
}
txt_last = txt_curr;
+ txt_curr->record_start = strptr == aptr;
txt_curr->length = substr_len;
txt_curr->txt = malloc (substr_len + 1/* Including null byte */);
if (txt_curr->txt == NULL)
status = ARES_ENOMEM;
break;
}
+
+ ++strptr;
memcpy ((char *) txt_curr->txt, strptr, substr_len);
/* Make sure we NULL-terminate */
## dns.resolveTxt(hostname, callback)
The same as `dns.resolve()`, but only for text queries (`TXT` records).
-`addresses` is an array of the text records available for `hostname` (e.g.,
-`['v=spf1 ip4:0.0.0.0 ~all']`).
+`addresses` is an 2-d array of the text records available for `hostname` (e.g.,
+`[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]`). Each sub-array contains TXT chunks of
+one record. Depending on the use case, the could be either joined together or
+treated separately.
## dns.resolveSrv(hostname, callback)
}
Local<Array> txt_records = Array::New(env()->isolate());
+ Local<Array> txt_chunk;
ares_txt_reply* current = txt_out;
- for (uint32_t i = 0; current != NULL; ++i, current = current->next) {
+ uint32_t i = 0;
+ for (uint32_t j = 0; current != NULL; current = current->next) {
Local<String> txt = OneByteString(env()->isolate(), current->txt);
- txt_records->Set(i, txt);
+ // New record found - write out the current chunk
+ if (current->record_start) {
+ if (!txt_chunk.IsEmpty())
+ txt_records->Set(i++, txt_chunk);
+ txt_chunk = Array::New(env()->isolate());
+ j = 0;
+ }
+ txt_chunk->Set(j++, txt);
}
+ // Push last chunk
+ txt_records->Set(i, txt_chunk);
ares_free_data(txt_out);