package pkarr
import (
"fmt"
"golang.org/x/net/dns/dnsmessage"
)
type txtRecord struct {
name string
txt string
}
func buildTxtPacket(name string , values []string , ttl uint32 ) ([]byte , error ) {
dnsName , err := dnsmessage .NewName (ensureFQDN (name ))
if err != nil {
return nil , fmt .Errorf ("invalid name %q: %w" , name , err )
}
b := dnsmessage .NewBuilder (nil , dnsmessage .Header {Response : true })
b .EnableCompression ()
if err := b .StartAnswers (); err != nil {
return nil , err
}
for _ , v := range values {
hdr := dnsmessage .ResourceHeader {
Name : dnsName ,
Type : dnsmessage .TypeTXT ,
Class : dnsmessage .ClassINET ,
TTL : ttl ,
}
if err := b .TXTResource (hdr , dnsmessage .TXTResource {TXT : splitTxt (v )}); err != nil {
return nil , err
}
}
return b .Finish ()
}
func parsePacket(encoded []byte ) ([]txtRecord , error ) {
var p dnsmessage .Parser
if _ , err := p .Start (encoded ); err != nil {
return nil , err
}
if err := p .SkipAllQuestions (); err != nil {
return nil , err
}
var out []txtRecord
for {
h , err := p .AnswerHeader ()
if err == dnsmessage .ErrSectionDone {
break
}
if err != nil {
return nil , err
}
if h .Type != dnsmessage .TypeTXT {
if err := p .SkipAnswer (); err != nil {
return nil , err
}
continue
}
r , err := p .TXTResource ()
if err != nil {
return nil , err
}
out = append (out , txtRecord {name : h .Name .String (), txt : joinTxt (r .TXT )})
}
return out , nil
}
func splitTxt(v string ) []string {
if len (v ) == 0 {
return []string {"" }
}
var out []string
for len (v ) > 255 {
out = append (out , v [:255 ])
v = v [255 :]
}
return append (out , v )
}
func joinTxt(parts []string ) string {
if len (parts ) == 1 {
return parts [0 ]
}
var s string
for _ , p := range parts {
s += p
}
return s
}
func ensureFQDN(name string ) string {
if len (name ) > 0 && name [len (name )-1 ] == '.' {
return name
}
return name + "."
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .