Fix encode/decode for root name ('.'). Add tests. Fixes #13.

This commit is contained in:
Tom Pusateri 2018-01-09 22:56:42 -05:00 committed by silverwind
parent 424f9e8809
commit 2e59f463e2
No known key found for this signature in database
GPG Key ID: 2E62B41C93869443
2 changed files with 48 additions and 8 deletions

View File

@ -11,19 +11,23 @@ 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
for (var i = 0; i < list.length; i++) { // strip leading and trailing .
var len = buf.write(list[i], offset + 1) const n = str.replace(/^\.|\.$/gm, '')
buf[offset] = len if (n.length) {
offset += len + 1 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 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
View File

@ -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)