Add MX Test
This commit is contained in:
parent
f44d8eed71
commit
27ddd5f1bf
|
@ -13,7 +13,7 @@ exports.DNS_PACKER_TYPE_CNAME = function (ab, dv, total, record) {
|
||||||
total += 2;
|
total += 2;
|
||||||
|
|
||||||
// RDATA
|
// RDATA
|
||||||
// i.e. 127.0.0.1 => 0x7F, 0x00, 0x00, 0x01
|
// a sequence of labels
|
||||||
record.data.split('.').forEach(function (label) {
|
record.data.split('.').forEach(function (label) {
|
||||||
cnameLen += 1 + label.length;
|
cnameLen += 1 + label.length;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
(function (exports) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// An 'MX' record is a 32-bit value representing the IP address
|
||||||
|
|
||||||
|
exports.DNS_PACKER_TYPE_MX = function (ab, dv, total, record) {
|
||||||
|
if (!record.exchange) {
|
||||||
|
throw new Error("no exchange for MX record");
|
||||||
|
}
|
||||||
|
if (!record.priority) {
|
||||||
|
// TODO: Check that number is in range 1-64k
|
||||||
|
throw new Error("no priority for MX record");
|
||||||
|
}
|
||||||
|
|
||||||
|
var mxLen = 2; // 16-bit priority plus label sequence
|
||||||
|
var rdLenIndex = total;
|
||||||
|
total += 2; // The space for RDLENGTH is reserved now and set below
|
||||||
|
dv.setUint16(total, parseInt(record.priority, 10), false);
|
||||||
|
total += 2;
|
||||||
|
|
||||||
|
// RDATA
|
||||||
|
// 16-bit priority and a sequence of labels as the exchange
|
||||||
|
record.exchange.split('.').forEach(function (label) {
|
||||||
|
mxLen += 1 + label.length;
|
||||||
|
|
||||||
|
dv.setUint8(total, label.length, false);
|
||||||
|
total += 1;
|
||||||
|
|
||||||
|
label.split('').forEach(function (ch) {
|
||||||
|
dv.setUint8(total, ch.charCodeAt(0), false);
|
||||||
|
total += 1;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// RDLENGTH
|
||||||
|
dv.setUint16(rdLenIndex, mxLen, false);
|
||||||
|
|
||||||
|
return total;
|
||||||
|
};
|
||||||
|
|
||||||
|
}('undefined' !== typeof window ? window : exports));
|
|
@ -1,7 +1,7 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var packer = require('../dns.packer.type.cname.js').DNS_PACKER_TYPE_CNAME;
|
var packer = require('../dns.packer.type.cname.js').DNS_PACKER_TYPE_CNAME;
|
||||||
var ab = new ArrayBuffer(255); // max len per label is 63, max label sequence is 254 + null terminator
|
var ab = new ArrayBuffer(254); // max len per label is 63, max label sequence is 254
|
||||||
var dv = new DataView(ab);
|
var dv = new DataView(ab);
|
||||||
var total = 0;
|
var total = 0;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var packer = require('../dns.packer.type.mx.js').DNS_PACKER_TYPE_MX;
|
||||||
|
var ab = new ArrayBuffer(256); // priority + max len per label is 63, max label sequence is 254
|
||||||
|
var dv = new DataView(ab);
|
||||||
|
var total = 0;
|
||||||
|
|
||||||
|
[ [ '10:www.example.com'
|
||||||
|
, [ 0x00, 0x12, 0x00, 0x0A, 0x03, 119, 119, 119, 0x07, 101, 120, 97, 109, 112, 108, 101, 0x03, 99, 111, 109 ].join(' ') ]
|
||||||
|
].forEach(function (mx) {
|
||||||
|
total = packer(ab, dv, total, { priority: mx[0].split(':')[0], exchange: mx[0].split(':')[1] });
|
||||||
|
ab = ab.slice(0, total);
|
||||||
|
// TODO: Check that total increments appropriately
|
||||||
|
if (mx[1] !== new Uint8Array(ab).join(' ')) {
|
||||||
|
console.error("expected: ", mx[1]);
|
||||||
|
console.error("actual: ", new Uint8Array(ab).join(' '));
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('PASS');
|
Loading…
Reference in New Issue