mirror of
https://github.com/coredns/coredns.git
synced 2025-10-28 16:54:15 -04:00
committed by
Miek Gieben
parent
367ed65f22
commit
f636930c5c
@@ -38,7 +38,7 @@ func (r *ResponseReverter) WriteMsg(res *dns.Msg) error {
|
|||||||
res.Question[0] = r.originalQuestion
|
res.Question[0] = r.originalQuestion
|
||||||
if r.ResponseRewrite {
|
if r.ResponseRewrite {
|
||||||
for _, rr := range res.Answer {
|
for _, rr := range res.Answer {
|
||||||
name := rr.(*dns.A).Hdr.Name
|
name := rr.Header().Name
|
||||||
for _, rule := range r.ResponseRules {
|
for _, rule := range r.ResponseRules {
|
||||||
regexGroups := rule.Pattern.FindStringSubmatch(name)
|
regexGroups := rule.Pattern.FindStringSubmatch(name)
|
||||||
if len(regexGroups) == 0 {
|
if len(regexGroups) == 0 {
|
||||||
@@ -53,7 +53,7 @@ func (r *ResponseReverter) WriteMsg(res *dns.Msg) error {
|
|||||||
}
|
}
|
||||||
name = s
|
name = s
|
||||||
}
|
}
|
||||||
rr.(*dns.A).Hdr.Name = name
|
rr.Header().Name = name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return r.ResponseWriter.WriteMsg(res)
|
return r.ResponseWriter.WriteMsg(res)
|
||||||
|
|||||||
59
plugin/rewrite/reverter_test.go
Normal file
59
plugin/rewrite/reverter_test.go
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package rewrite
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/coredns/coredns/plugin"
|
||||||
|
"github.com/coredns/coredns/plugin/pkg/dnstest"
|
||||||
|
"github.com/coredns/coredns/plugin/test"
|
||||||
|
|
||||||
|
"github.com/miekg/dns"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestResponseReverter(t *testing.T) {
|
||||||
|
rules := []Rule{}
|
||||||
|
r, _ := newNameRule("stop", "regex", `(core)\.(dns)\.(rocks)`, "{2}.{1}.{3}", "answer", "name", `(dns)\.(core)\.(rocks)`, "{2}.{1}.{3}")
|
||||||
|
rules = append(rules, r)
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
from string
|
||||||
|
fromType uint16
|
||||||
|
answer []dns.RR
|
||||||
|
to string
|
||||||
|
toType uint16
|
||||||
|
noRevert bool
|
||||||
|
}{
|
||||||
|
{"core.dns.rocks", dns.TypeA, []dns.RR{test.A("dns.core.rocks. 5 IN A 10.0.0.1")}, "core.dns.rocks", dns.TypeA, false},
|
||||||
|
{"core.dns.rocks", dns.TypeSRV, []dns.RR{test.SRV("dns.core.rocks. 5 IN SRV 0 100 100 srv1.dns.core.rocks.")}, "core.dns.rocks", dns.TypeSRV, false},
|
||||||
|
{"core.dns.rocks", dns.TypeA, []dns.RR{test.A("core.dns.rocks. 5 IN A 10.0.0.1")}, "dns.core.rocks.", dns.TypeA, true},
|
||||||
|
{"core.dns.rocks", dns.TypeSRV, []dns.RR{test.SRV("core.dns.rocks. 5 IN SRV 0 100 100 srv1.dns.core.rocks.")}, "dns.core.rocks.", dns.TypeSRV, true},
|
||||||
|
{"core.dns.rocks", dns.TypeHINFO, []dns.RR{test.HINFO("core.dns.rocks. 5 HINFO INTEL-64 \"RHEL 7.4\"")}, "core.dns.rocks", dns.TypeHINFO, false},
|
||||||
|
{"core.dns.rocks", dns.TypeA, []dns.RR{
|
||||||
|
test.A("dns.core.rocks. 5 IN A 10.0.0.1"),
|
||||||
|
test.A("dns.core.rocks. 5 IN A 10.0.0.2"),
|
||||||
|
}, "core.dns.rocks", dns.TypeA, false},
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.TODO()
|
||||||
|
for i, tc := range tests {
|
||||||
|
m := new(dns.Msg)
|
||||||
|
m.SetQuestion(tc.from, tc.fromType)
|
||||||
|
m.Question[0].Qclass = dns.ClassINET
|
||||||
|
m.Answer = tc.answer
|
||||||
|
rw := Rewrite{
|
||||||
|
Next: plugin.HandlerFunc(msgPrinter),
|
||||||
|
Rules: rules,
|
||||||
|
noRevert: tc.noRevert,
|
||||||
|
}
|
||||||
|
rec := dnstest.NewRecorder(&test.ResponseWriter{})
|
||||||
|
rw.ServeDNS(ctx, rec, m)
|
||||||
|
resp := rec.Msg
|
||||||
|
if resp.Question[0].Name != tc.to {
|
||||||
|
t.Errorf("Test %d: Expected Name to be %q but was %q", i, tc.to, resp.Question[0].Name)
|
||||||
|
}
|
||||||
|
if resp.Question[0].Qtype != tc.toType {
|
||||||
|
t.Errorf("Test %d: Expected Type to be '%d' but was '%d'", i, tc.toType, resp.Question[0].Qtype)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -81,6 +81,9 @@ func PTR(rr string) *dns.PTR { r, _ := dns.NewRR(rr); return r.(*dns.PTR) }
|
|||||||
// TXT returns a TXT record from rr. It panics on errors.
|
// TXT returns a TXT record from rr. It panics on errors.
|
||||||
func TXT(rr string) *dns.TXT { r, _ := dns.NewRR(rr); return r.(*dns.TXT) }
|
func TXT(rr string) *dns.TXT { r, _ := dns.NewRR(rr); return r.(*dns.TXT) }
|
||||||
|
|
||||||
|
// HINFO returns a HINFO record from rr. It panics on errors.
|
||||||
|
func HINFO(rr string) *dns.HINFO { r, _ := dns.NewRR(rr); return r.(*dns.HINFO) }
|
||||||
|
|
||||||
// MX returns an MX record from rr. It panics on errors.
|
// MX returns an MX record from rr. It panics on errors.
|
||||||
func MX(rr string) *dns.MX { r, _ := dns.NewRR(rr); return r.(*dns.MX) }
|
func MX(rr string) *dns.MX { r, _ := dns.NewRR(rr); return r.(*dns.MX) }
|
||||||
|
|
||||||
@@ -215,6 +218,13 @@ func Section(t *testing.T, tc Case, sec sect, rr []dns.RR) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case *dns.HINFO:
|
||||||
|
if x.Cpu != section[i].(*dns.HINFO).Cpu {
|
||||||
|
t.Errorf("rr %d should have a Cpu of %s, but has %s", i, section[i].(*dns.HINFO).Cpu, x.Cpu)
|
||||||
|
}
|
||||||
|
if x.Os != section[i].(*dns.HINFO).Os {
|
||||||
|
t.Errorf("rr %d should have a Os of %s, but has %s", i, section[i].(*dns.HINFO).Os, x.Os)
|
||||||
|
}
|
||||||
case *dns.SOA:
|
case *dns.SOA:
|
||||||
tt := section[i].(*dns.SOA)
|
tt := section[i].(*dns.SOA)
|
||||||
if x.Ns != tt.Ns {
|
if x.Ns != tt.Ns {
|
||||||
|
|||||||
Reference in New Issue
Block a user