49 lines
1.6 KiB
JavaScript
49 lines
1.6 KiB
JavaScript
(function (exports) {
|
|
'use strict';
|
|
|
|
// Value: IP Address
|
|
// Meaning:Use: 16 octets represting the IP address
|
|
|
|
exports.DNS_PARSER_TYPE_AAAA = function (ab, packet, record) {
|
|
|
|
var rdataAb = ab.slice(record.rdstart, record.rdstart + record.rdlength);
|
|
// We can't use Uint16Array because it doesn't specify Endianness
|
|
// Intel x86, x64, and (usually) ARM are Little Endian, but Network Order is Big Endian
|
|
// DataView *does* let us specify endianness, so we can use that
|
|
// http://stackoverflow.com/questions/13514614/why-is-network-byte-order-defined-to-be-big-endian
|
|
var dv = new DataView(rdataAb);
|
|
var i = 0;
|
|
var s = '';
|
|
|
|
// Note: byteLength is always 16 for AAAA records
|
|
for (i = 0; i < dv.byteLength; i += 2) {
|
|
|
|
if (i > 0 && i < dv.byteLength) {
|
|
// add ':' between all... sedectets? sexdectets? ... pairs of two octets :)
|
|
s += ':';
|
|
}
|
|
|
|
// Big Endian Uint16 is specified by using `false`, Little Endian is `true`
|
|
s += dv.getUint16(i, false).toString(16);
|
|
}
|
|
|
|
// Represent the string address as recommended on the wikipedia page
|
|
// https://en.wikipedia.org/wiki/IPv6_address#Recommended_representation_as_text.
|
|
// (shorten the longest section of 0's as long as it's more than one section, replacing
|
|
// the left-most instance in the event of ties.)
|
|
var re = /:(0:)+/g;
|
|
var match;
|
|
var longest = '_BAD';
|
|
while (!!(match = re.exec(s))) {
|
|
if (match[0].length > longest.length) {
|
|
longest = match[0];
|
|
}
|
|
}
|
|
s = s.replace(longest, '::');
|
|
|
|
record.address = s;
|
|
return record;
|
|
};
|
|
|
|
}('undefined' !== typeof window ? window : exports));
|