mirror of
https://github.com/coredns/coredns.git
synced 2025-12-08 03:15:41 -05:00
middleware/file: Add CNAME chain support (#400)
Up till now we would only chase 1 CNAME. Spec requires we will chase all. This PR add support for this. Up to 8 CNAMEs are chased (this could be longer, by just checking for cycles, but 8 seems enough for now). Also add RRSIG of the first CNAME for DNSSEC.
This commit is contained in:
98
middleware/file/cname_test.go
Normal file
98
middleware/file/cname_test.go
Normal file
@@ -0,0 +1,98 @@
|
||||
package file
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/miekg/coredns/middleware/pkg/dnsrecorder"
|
||||
"github.com/miekg/coredns/middleware/test"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
func TestLookupCNAMEChain(t *testing.T) {
|
||||
name := "example.org."
|
||||
zone, err := Parse(strings.NewReader(dbExampleCNAME), name, "stdin")
|
||||
if err != nil {
|
||||
t.Fatalf("Expected no error when reading zone, got %q", err)
|
||||
}
|
||||
|
||||
fm := File{Next: test.ErrorHandler(), Zones: Zones{Z: map[string]*Zone{name: zone}, Names: []string{name}}}
|
||||
ctx := context.TODO()
|
||||
|
||||
for _, tc := range cnameTestCases {
|
||||
m := tc.Msg()
|
||||
|
||||
rec := dnsrecorder.New(&test.ResponseWriter{})
|
||||
_, err := fm.ServeDNS(ctx, rec, m)
|
||||
if err != nil {
|
||||
t.Errorf("Expected no error, got %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
resp := rec.Msg
|
||||
sort.Sort(test.RRSet(resp.Answer))
|
||||
sort.Sort(test.RRSet(resp.Ns))
|
||||
sort.Sort(test.RRSet(resp.Extra))
|
||||
|
||||
if !test.Header(t, tc, resp) {
|
||||
t.Logf("%v\n", resp)
|
||||
continue
|
||||
}
|
||||
|
||||
if !test.Section(t, tc, test.Answer, resp.Answer) {
|
||||
t.Logf("%v\n", resp)
|
||||
}
|
||||
if !test.Section(t, tc, test.Ns, resp.Ns) {
|
||||
t.Logf("%v\n", resp)
|
||||
|
||||
}
|
||||
if !test.Section(t, tc, test.Extra, resp.Extra) {
|
||||
t.Logf("%v\n", resp)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var cnameTestCases = []test.Case{
|
||||
{
|
||||
Qname: "a.example.org.", Qtype: dns.TypeA,
|
||||
Answer: []dns.RR{
|
||||
test.A("a.example.org. 1800 IN A 127.0.0.1"),
|
||||
},
|
||||
},
|
||||
{
|
||||
Qname: "www3.example.org.", Qtype: dns.TypeCNAME,
|
||||
Answer: []dns.RR{
|
||||
test.CNAME("www3.example.org. 1800 IN CNAME www2.example.org."),
|
||||
},
|
||||
},
|
||||
{
|
||||
Qname: "www3.example.org.", Qtype: dns.TypeA,
|
||||
Answer: []dns.RR{
|
||||
test.A("a.example.org. 1800 IN A 127.0.0.1"),
|
||||
test.CNAME("www.example.org. 1800 IN CNAME a.example.org."),
|
||||
test.CNAME("www1.example.org. 1800 IN CNAME www.example.org."),
|
||||
test.CNAME("www2.example.org. 1800 IN CNAME www1.example.org."),
|
||||
test.CNAME("www3.example.org. 1800 IN CNAME www2.example.org."),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
const dbExampleCNAME = `
|
||||
$TTL 30M
|
||||
$ORIGIN example.org.
|
||||
@ IN SOA linode.atoom.net. miek.miek.nl. (
|
||||
1282630057 ; Serial
|
||||
4H ; Refresh
|
||||
1H ; Retry
|
||||
7D ; Expire
|
||||
4H ) ; Negative Cache TTL
|
||||
|
||||
a IN A 127.0.0.1
|
||||
www3 IN CNAME www2
|
||||
www2 IN CNAME www1
|
||||
www1 IN CNAME www
|
||||
www IN CNAME a
|
||||
dangling IN CNAME foo`
|
||||
Reference in New Issue
Block a user