Skip to content

Commit

Permalink
simplify API
Browse files Browse the repository at this point in the history
  • Loading branch information
mateusz834 committed Dec 25, 2023
1 parent 98ea9f9 commit c6b8576
Show file tree
Hide file tree
Showing 9 changed files with 1,167 additions and 1,741 deletions.
467 changes: 26 additions & 441 deletions builder.go

Large diffs are not rendered by default.

489 changes: 174 additions & 315 deletions builder_test.go

Large diffs are not rendered by default.

29 changes: 11 additions & 18 deletions edns0.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,9 @@ type EDNS0Header struct {
}

// AsResourceHeader converts [EDNS0Header] into a [ResourceHeader].
func (e EDNS0Header) AsResourceHeader() ResourceHeader[RawName] {
return ResourceHeader[RawName]{
Name: []byte{0},
func (e EDNS0Header) AsResourceHeader() ResourceHeader {
return ResourceHeader{
Name: Name{Length: 1},
Type: TypeOPT,
Class: Class(e.Payload),
TTL: uint32(e.PartialExtendedRCode)<<24 | uint32(e.Version)<<16 | uint32(e.ExtendedFlags),
Expand All @@ -69,20 +69,13 @@ var errInvalidEDNS0Header = errors.New("invalid EDNS(0) header")
// AsEDNS0Header parses the ResourceHeader into an [EDNS0Header].
//
// This function should only be called when the h.Type is equal to [TypeOPT].
func (h *ResourceHeader[T]) AsEDNS0Header() (EDNS0Header, error) {
func (h *ResourceHeader) AsEDNS0Header() (EDNS0Header, error) {
if h.Type != TypeOPT {
return EDNS0Header{}, errInvalidOperation
}

switch v := any(h.Name).(type) {
case ParserName:
if !v.isRoot() {
return EDNS0Header{}, errInvalidEDNS0Header
}
case RawName:
if len(v) != 1 {
return EDNS0Header{}, errInvalidEDNS0Header
}
if h.Name.Length != 1 {
return EDNS0Header{}, errInvalidEDNS0Header
}

return EDNS0Header{
Expand Down Expand Up @@ -193,7 +186,7 @@ func (r *ResourceOPT) EncodingLength() int {
// It errors when the amount of resources in the current section is equal to 65535.
//
// The building section must NOT be set to questions, otherwise it panics.
func (b *Builder) ResourceOPT(hdr ResourceHeader[RawName], opt ResourceOPT) error {
func (b *Builder) ResourceOPT(hdr ResourceHeader, opt ResourceOPT) error {
optb, err := b.ResourceOPTBuilder(hdr)
if err != nil {
return err
Expand Down Expand Up @@ -224,7 +217,7 @@ func (b *Builder) ResourceOPT(hdr ResourceHeader[RawName], opt ResourceOPT) erro
// on the Builder until you call [ResourceOPTBuilder.End] or [ResourceOPTBuilder.Remove].
//
// The building section must NOT be set to questions, otherwise it panics.
func (b *Builder) ResourceOPTBuilder(hdr ResourceHeader[RawName]) (ResourceOPTBuilder, error) {
func (b *Builder) ResourceOPTBuilder(hdr ResourceHeader) (ResourceOPTBuilder, error) {
hdr.Type = TypeOPT
fixup, hdrOffset, c, err := b.appendHeaderWithLengthFixupNoInc(hdr, b.maxBufSize)
if err != nil {
Expand Down Expand Up @@ -386,10 +379,10 @@ func (b *EDNS0OptionBuilder) Remove() {
}

// Name appends a DNS name to the option.
func (b *EDNS0OptionBuilder) Name(name RawName, compress bool) error {
func (b *EDNS0OptionBuilder) Name(name Name, compress bool) error {
nameOffset := len(b.b.b.buf)
var err error
b.b.b.buf, err = b.b.b.nb.appendName(b.b.b.buf, b.b.b.maxBufSize, b.b.b.headerStartOffset, name, compress)
b.b.b.buf, err = b.b.b.nb.appendName(b.b.b.buf, b.b.b.maxBufSize, b.b.b.headerStartOffset, name.asSlice(), compress)
if err != nil {
return err
}
Expand Down Expand Up @@ -703,7 +696,7 @@ func (p *EDNS0OptionParser) End() error {
}

// Name parses a single DNS name.
func (p *EDNS0OptionParser) Name() (ParserName, error) {
func (p *EDNS0OptionParser) Name() (Name, error) {
return p.rd.Name()
}

Expand Down
59 changes: 30 additions & 29 deletions edns0_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ func TestEDNS0Header(t *testing.T) {
b.StartAnswers()
b.StartAuthorities()
b.StartAdditionals()
rdb, err := b.RDBuilder(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
rdb, err := b.RDBuilder(ResourceHeader{
Name: MustParseName("example.com"),
Type: TypeOPT,
})
if err != nil {
Expand Down Expand Up @@ -111,7 +111,7 @@ func TestEDNS0Header(t *testing.T) {
t.Fatalf("p.ResourceHeader().AsEDNS0Header() unexpected error: %v, want %v", err, errInvalidEDNS0Header)
}

edns0ResHdr.Name = MustNewRawName("example.com")
edns0ResHdr.Name = MustParseName("example.com")
if _, err = edns0ResHdr.AsEDNS0Header(); err != errInvalidEDNS0Header {
t.Fatalf("%#v.AsEDNS0Header() unexpected error: %v, want: %v", edns0ResHdr, err, errInvalidEDNS0Header)
}
Expand Down Expand Up @@ -147,8 +147,8 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
}

expectPanic("b.ResourceA()", func() {
b.ResourceA(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
b.ResourceA(ResourceHeader{
Name: MustParseName("example.com"),
}, ResourceA{A: [4]byte{192, 0, 2, 1}})
})

Expand Down Expand Up @@ -206,8 +206,8 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
}

expectPanic("b.ResourceA()", func() {
b.ResourceA(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
b.ResourceA(ResourceHeader{
Name: MustParseName("example.com"),
}, ResourceA{A: [4]byte{192, 0, 2, 1}})
})

Expand Down Expand Up @@ -248,8 +248,8 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
t.Fatalf("changes caused by ResourceOPTBuilder visible before End()")
}
expectPanic("b.ResourceA()", func() {
b.ResourceA(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
b.ResourceA(ResourceHeader{
Name: MustParseName("example.com"),
}, ResourceA{A: [4]byte{192, 0, 2, 1}})
})

Expand All @@ -264,8 +264,8 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
t.Fatalf("changes caused by ResourceOPTBuilder visible before End()")
}
expectPanic("b.ResourceA()", func() {
b.ResourceA(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
b.ResourceA(ResourceHeader{
Name: MustParseName("example.com"),
}, ResourceA{A: [4]byte{192, 0, 2, 1}})
})
optb1.Remove()
Expand All @@ -284,8 +284,8 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
}

expectPanic("b.ResourceA()", func() {
b.ResourceA(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
b.ResourceA(ResourceHeader{
Name: MustParseName("example.com"),
}, ResourceA{A: [4]byte{192, 0, 2, 1}})
})

Expand All @@ -311,7 +311,7 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
})
})

if err := optb2.Name(MustNewRawName("example.com"), false); err != nil {
if err := optb2.Name(MustParseName("example.com"), false); err != nil {
t.Fatalf(`optb2.Name(MustNewRawName("example.com") unexpected error: %v`, err)
}
if l := optb2.Length(); l != 13 {
Expand All @@ -323,16 +323,16 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
if l := optsb.Length(); l != beforeOptResourceLength {
t.Fatalf("optsb.Length() = %v, want: %v", l, beforeOptResourceLength)
}
if err := optb2.Name(MustNewRawName("example.com"), true); err != nil {
if err := optb2.Name(MustParseName("example.com"), true); err != nil {
t.Fatalf(`optb2.Name(MustNewRawName("example.com", true)) unexpected error: %v`, err)
}
if l := optb2.Length(); l != 15 {
t.Fatalf("optsb.Length() = %v, want: 15", l)
}
if err := optb2.Name(MustNewRawName("www.example.com"), true); err != nil {
if err := optb2.Name(MustParseName("www.example.com"), true); err != nil {
t.Fatalf(`optb2.Name(MustNewRawName("www.example.com", true)) unexpected error: %v`, err)
}
if err := optb2.Name(MustNewRawName("www.example.com"), false); err != nil {
if err := optb2.Name(MustParseName("www.example.com"), false); err != nil {
t.Fatalf(`optb2.Name(MustNewRawName("www.example.com", false)) unexpected error: %v`, err)
}
if err := optb2.Uint8(11); err != nil {
Expand All @@ -357,8 +357,8 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
t.Fatalf("optsb.Length() = %v, want: %v", l, beforeOptResourceLength)
}
expectPanic("b.ResourceA()", func() {
b.ResourceA(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
b.ResourceA(ResourceHeader{
Name: MustParseName("example.com"),
}, ResourceA{A: [4]byte{192, 0, 2, 1}})
})
expectPanic("optsb.ClientSubnet()", func() {
Expand Down Expand Up @@ -387,8 +387,8 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
t.Fatalf("changes caused by EDNS0OptionBuilder visible before End()")
}
expectPanic("b.ResourceA()", func() {
b.ResourceA(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
b.ResourceA(ResourceHeader{
Name: MustParseName("example.com"),
}, ResourceA{A: [4]byte{192, 0, 2, 1}})
})
optsb.End()
Expand Down Expand Up @@ -603,12 +603,13 @@ func TestResourceOPTBuilderAndParser(t *testing.T) {
}
}

func expectParserName(t *testing.T, prefix string, name ParserName, expectNameAsStr string, comressed bool) {
if !bytes.Equal(MustNewRawName(expectNameAsStr), name.AsRawName()) {
func expectParserName(t *testing.T, prefix string, name Name, expectNameAsStr string, comressed bool) {
if !bytes.Equal(nameAsSlice(expectNameAsStr), name.asSlice()) {
t.Fatalf("%v = %v, want: %v", prefix, name.String(), expectNameAsStr)
}
if name.Compressed() != comressed {
t.Fatalf("%v.Compressed() = %v, want: %v", prefix, name.Compressed(), comressed)
c := name.Compression == CompressionCompressed
if c != comressed {
t.Fatalf("%v.Compressed = %v, want: %v", prefix, c, comressed)
}
}

Expand Down Expand Up @@ -645,8 +646,8 @@ func TestResourceOPTEncodingLength(t *testing.T) {
b.StartAnswers()

for {
err := b.ResourceA(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
err := b.ResourceA(ResourceHeader{
Name: MustParseName("example.com"),
}, ResourceA{A: [4]byte{192, 0, 2, 1}})
if err != nil {
if err == ErrTruncated {
Expand All @@ -664,8 +665,8 @@ func TestResourceOPTEncodingLength(t *testing.T) {
t.Fatalf("b.ResourceOPT() unexpected error: %v", err)
}

err := b.ResourceA(ResourceHeader[RawName]{
Name: MustNewRawName("example.com"),
err := b.ResourceA(ResourceHeader{
Name: MustParseName("example.com"),
}, ResourceA{A: [4]byte{192, 0, 2, 1}})
if err != ErrTruncated {
t.Fatalf("b.ResourceA() unexpected error: %v, want: %v", err, ErrTruncated)
Expand Down
Loading

0 comments on commit c6b8576

Please sign in to comment.