Fix encode/decode for root name ('.'). Add tests. Fixes #13.
This commit is contained in:
parent
424f9e8809
commit
2e59f463e2
24
index.js
24
index.js
@ -11,19 +11,23 @@ var NOT_FLUSH_MASK = ~FLUSH_MASK
|
||||
var QU_MASK = 1 << 15
|
||||
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 (!offset) offset = 0
|
||||
|
||||
var list = n.split('.')
|
||||
var oldOffset = offset
|
||||
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
var len = buf.write(list[i], offset + 1)
|
||||
buf[offset] = len
|
||||
offset += len + 1
|
||||
// strip leading and trailing .
|
||||
const n = str.replace(/^\.|\.$/gm, '')
|
||||
if (n.length) {
|
||||
const list = n.split('.')
|
||||
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
var len = buf.write(list[i], offset + 1)
|
||||
buf[offset] = len
|
||||
offset += len + 1
|
||||
}
|
||||
}
|
||||
|
||||
buf[offset++] = 0
|
||||
@ -41,6 +45,10 @@ name.decode = function (buf, offset) {
|
||||
var oldOffset = offset
|
||||
var len = buf[offset++]
|
||||
|
||||
if (len === 0) {
|
||||
name.decode.bytes = 1
|
||||
return '.'
|
||||
}
|
||||
if (len >= 0xc0) {
|
||||
var res = name.decode(buf, buf.readUInt16BE(offset - 1) - 0xc000)
|
||||
name.decode.bytes = 2
|
||||
|
||||
32
test.js
32
test.js
@ -213,6 +213,38 @@ tape('rcode', function (t) {
|
||||
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) {
|
||||
var buf = packet.encode(val)
|
||||
var val2 = packet.decode(buf)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user