Skip to content

Commit

Permalink
Fix encode/decode for root name ('.'). Add tests. Fixes #13.
Browse files Browse the repository at this point in the history
  • Loading branch information
pusateri authored and silverwind committed Jan 10, 2018
1 parent 424f9e8 commit 2e59f46
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 8 deletions.
24 changes: 16 additions & 8 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
32 changes: 32 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 2e59f46

Please sign in to comment.