Fix encode/decode for root name ('.'). Add tests. Fixes #13.
This commit is contained in:
parent
424f9e8809
commit
2e59f463e2
16
index.js
16
index.js
@ -11,20 +11,24 @@ var NOT_FLUSH_MASK = ~FLUSH_MASK
|
|||||||
var QU_MASK = 1 << 15
|
var QU_MASK = 1 << 15
|
||||||
var NOT_QU_MASK = ~QU_MASK
|
var NOT_QU_MASK = ~QU_MASK
|
||||||
|
|
||||||
var name = {}
|
var name = exports.txt = exports.name = {}
|
||||||
|
|
||||||
name.encode = function (n, buf, offset) {
|
name.encode = function (str, buf, offset) {
|
||||||
if (!buf) buf = Buffer.allocUnsafe(name.encodingLength(n))
|
if (!buf) buf = Buffer.allocUnsafe(name.encodingLength(n))
|
||||||
if (!offset) offset = 0
|
if (!offset) offset = 0
|
||||||
|
|
||||||
var list = n.split('.')
|
|
||||||
var oldOffset = offset
|
var oldOffset = offset
|
||||||
|
|
||||||
|
// strip leading and trailing .
|
||||||
|
const n = str.replace(/^\.|\.$/gm, '')
|
||||||
|
if (n.length) {
|
||||||
|
const list = n.split('.')
|
||||||
|
|
||||||
for (var i = 0; i < list.length; i++) {
|
for (var i = 0; i < list.length; i++) {
|
||||||
var len = buf.write(list[i], offset + 1)
|
var len = buf.write(list[i], offset + 1)
|
||||||
buf[offset] = len
|
buf[offset] = len
|
||||||
offset += len + 1
|
offset += len + 1
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buf[offset++] = 0
|
buf[offset++] = 0
|
||||||
|
|
||||||
@ -41,6 +45,10 @@ name.decode = function (buf, offset) {
|
|||||||
var oldOffset = offset
|
var oldOffset = offset
|
||||||
var len = buf[offset++]
|
var len = buf[offset++]
|
||||||
|
|
||||||
|
if (len === 0) {
|
||||||
|
name.decode.bytes = 1
|
||||||
|
return '.'
|
||||||
|
}
|
||||||
if (len >= 0xc0) {
|
if (len >= 0xc0) {
|
||||||
var res = name.decode(buf, buf.readUInt16BE(offset - 1) - 0xc000)
|
var res = name.decode(buf, buf.readUInt16BE(offset - 1) - 0xc000)
|
||||||
name.decode.bytes = 2
|
name.decode.bytes = 2
|
||||||
|
|||||||
32
test.js
32
test.js
@ -213,6 +213,38 @@ tape('rcode', function (t) {
|
|||||||
t.end()
|
t.end()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
tape('name_encoding', function (t) {
|
||||||
|
var data = 'foo.example.com'
|
||||||
|
var buf = Buffer.allocUnsafe(255)
|
||||||
|
var offset = 0
|
||||||
|
packet.name.encode(data, buf, offset)
|
||||||
|
t.ok(packet.name.encode.bytes === 17, 'name encoding length matches')
|
||||||
|
var dd = packet.name.decode(buf, offset)
|
||||||
|
t.ok(data === dd, 'encode/decode matches')
|
||||||
|
offset += packet.name.encode.bytes
|
||||||
|
|
||||||
|
data = 'com'
|
||||||
|
packet.name.encode(data, buf, offset)
|
||||||
|
t.ok(packet.name.encode.bytes === 5, 'name encoding length matches')
|
||||||
|
dd = packet.name.decode(buf, offset)
|
||||||
|
t.ok(data === dd, 'encode/decode matches')
|
||||||
|
offset += packet.name.encode.bytes
|
||||||
|
|
||||||
|
data = 'example.com.'
|
||||||
|
packet.name.encode(data, buf, offset)
|
||||||
|
t.ok(packet.name.encode.bytes === 13, 'name encoding length matches')
|
||||||
|
dd = packet.name.decode(buf, offset)
|
||||||
|
t.ok(data.slice(0, -1) === dd, 'encode/decode matches')
|
||||||
|
offset += packet.name.encode.bytes
|
||||||
|
|
||||||
|
data = '.'
|
||||||
|
packet.name.encode(data, buf, offset)
|
||||||
|
t.ok(packet.name.encode.bytes === 1, 'name encoding length matches')
|
||||||
|
dd = packet.name.decode(buf, offset)
|
||||||
|
t.ok(data === dd, 'encode/decode matches')
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
function testEncoder (t, packet, val) {
|
function testEncoder (t, packet, val) {
|
||||||
var buf = packet.encode(val)
|
var buf = packet.encode(val)
|
||||||
var val2 = packet.decode(buf)
|
var val2 = packet.decode(buf)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user