From a6ad95f2993d18a24a6bfb650bd66a0c9d0133dd Mon Sep 17 00:00:00 2001 From: WeebDataHoarder <57538841+WeebDataHoarder@users.noreply.github.com> Date: Wed, 15 Jun 2022 11:59:49 +0200 Subject: [PATCH] RRSet encode/decode --- rr.go | 27 +++++++++++++++++++++++++++ rr_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 rr_test.go diff --git a/rr.go b/rr.go index 3d57026..a4657b5 100644 --- a/rr.go +++ b/rr.go @@ -119,3 +119,30 @@ func (s RRSet) OnlyTypes(allow ...uint16) (result RRSet) { return } + +func (s RRSet) Encode() (result []byte, err error) { + var off int + for _, rr := range s { + buf := make([]byte, dns.Len(rr)) + off, err = dns.PackRR(rr, buf, 0, nil, false) + if err != nil { + return nil, err + } + result = append(result, buf[:off]...) + } + + return result, nil +} + +func DecodeRRSet(buf []byte) (result RRSet, err error) { + for len(buf) > 0 { + rr, off, err := dns.UnpackRR(buf, 0) + if err != nil { + return nil, err + } + buf = buf[off:] + result = append(result, rr) + } + + return result, nil +} diff --git a/rr_test.go b/rr_test.go new file mode 100644 index 0000000..ccad51b --- /dev/null +++ b/rr_test.go @@ -0,0 +1,32 @@ +package dns_api + +import ( + "net" + "testing" +) + +func TestDecodeEncode(t *testing.T) { + zone := NewZoneFromPrivateKey(testZone, DecodeTorPrivateKey(testPrivateKey)) + + zone.AddRecordTXT("@", []string{"test"}, 3600) + zone.AddRecordA("test", net.IPv4(1, 2, 3, 4), 3600) + + t.Logf("encoded:") + for _, rr := range zone.GetRRSet() { + t.Logf(" %s\n", rr.String()) + } + + buf, err := zone.GetRRSet().Encode() + if err != nil { + t.Error(err) + } + + rrset, err := DecodeRRSet(buf) + if err != nil { + t.Error(err) + } + t.Logf("decoded:") + for _, rr := range rrset { + t.Logf(" %s\n", rr.String()) + } +}