aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--middleware/cache/cache_test.go22
-rw-r--r--middleware/cache/item.go7
2 files changed, 28 insertions, 1 deletions
diff --git a/middleware/cache/cache_test.go b/middleware/cache/cache_test.go
index 7e80c66e0..31aeaa8ac 100644
--- a/middleware/cache/cache_test.go
+++ b/middleware/cache/cache_test.go
@@ -1,6 +1,8 @@
package cache
import (
+ "io/ioutil"
+ "log"
"testing"
"time"
@@ -64,12 +66,30 @@ var cacheTestCases = []cacheTestCase{
},
in: test.Case{},
},
+ {
+ RecursionAvailable: true, Authoritative: true,
+ Case: test.Case{
+ Rcode: dns.RcodeNameError,
+ Qname: "example.org.", Qtype: dns.TypeA,
+ Ns: []dns.RR{
+ test.SOA("example.org. 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. 2016082540 7200 3600 1209600 3600"),
+ },
+ },
+ in: test.Case{
+ Rcode: dns.RcodeNameError,
+ Qname: "example.org.", Qtype: dns.TypeA,
+ Ns: []dns.RR{
+ test.SOA("example.org. 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. 2016082540 7200 3600 1209600 3600"),
+ },
+ },
+ },
}
func cacheMsg(m *dns.Msg, tc cacheTestCase) *dns.Msg {
m.RecursionAvailable = tc.RecursionAvailable
m.AuthenticatedData = tc.AuthenticatedData
m.Authoritative = tc.Authoritative
+ m.Rcode = tc.Rcode
m.Truncated = tc.Truncated
m.Answer = tc.in.Answer
m.Ns = tc.in.Ns
@@ -89,6 +109,8 @@ func newTestCache(ttl time.Duration) (*Cache, *ResponseWriter) {
func TestCache(t *testing.T) {
c, crr := newTestCache(maxTTL)
+ log.SetOutput(ioutil.Discard)
+
for _, tc := range cacheTestCases {
m := tc.in.Msg()
m = cacheMsg(m, tc)
diff --git a/middleware/cache/item.go b/middleware/cache/item.go
index d2cb79520..f2d05f0a0 100644
--- a/middleware/cache/item.go
+++ b/middleware/cache/item.go
@@ -8,6 +8,7 @@ import (
)
type item struct {
+ Rcode int
Authoritative bool
AuthenticatedData bool
RecursionAvailable bool
@@ -21,6 +22,7 @@ type item struct {
func newItem(m *dns.Msg, d time.Duration) *item {
i := new(item)
+ i.Rcode = m.Rcode
i.Authoritative = m.Authoritative
i.AuthenticatedData = m.AuthenticatedData
i.RecursionAvailable = m.RecursionAvailable
@@ -45,12 +47,15 @@ func newItem(m *dns.Msg, d time.Duration) *item {
}
// toMsg turns i into a message, it tailers the reply to m.
+// The Autoritative bit is always set to 0, because the answer is from the cache.
func (i *item) toMsg(m *dns.Msg) *dns.Msg {
m1 := new(dns.Msg)
m1.SetReply(m)
- m1.Authoritative = i.Authoritative
+
+ m1.Authoritative = false
m1.AuthenticatedData = i.AuthenticatedData
m1.RecursionAvailable = i.RecursionAvailable
+ m1.Rcode = i.Rcode
m1.Compress = true
m1.Answer = i.Answer