core: export ClientWrite (#849)

Make ClientWrite available for middleware to use.
This commit is contained in:
Miek Gieben
2017-08-07 07:39:57 -07:00
committed by GitHub
parent 760e667063
commit 468d5b57de
2 changed files with 19 additions and 17 deletions

View File

@@ -205,7 +205,7 @@ func (s *Server) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg)
if h, ok := s.zones[string(b[:l])]; ok {
if r.Question[0].Qtype != dns.TypeDS {
rcode, _ := h.middlewareChain.ServeDNS(ctx, w, r)
if rcodeNoClientWrite(rcode) {
if !middleware.ClientWrite(rcode) {
DefaultErrorFunc(w, r, rcode)
}
return
@@ -226,7 +226,7 @@ func (s *Server) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg)
if dshandler != nil {
// DS request, and we found a zone, use the handler for the query
rcode, _ := dshandler.middlewareChain.ServeDNS(ctx, w, r)
if rcodeNoClientWrite(rcode) {
if !middleware.ClientWrite(rcode) {
DefaultErrorFunc(w, r, rcode)
}
return
@@ -235,7 +235,7 @@ func (s *Server) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg)
// Wildcard match, if we have found nothing try the root zone as a last resort.
if h, ok := s.zones["."]; ok {
rcode, _ := h.middlewareChain.ServeDNS(ctx, w, r)
if rcodeNoClientWrite(rcode) {
if !middleware.ClientWrite(rcode) {
DefaultErrorFunc(w, r, rcode)
}
return
@@ -282,20 +282,6 @@ func DefaultErrorFunc(w dns.ResponseWriter, r *dns.Msg, rc int) {
w.WriteMsg(answer)
}
func rcodeNoClientWrite(rcode int) bool {
switch rcode {
case dns.RcodeServerFailure:
fallthrough
case dns.RcodeRefused:
fallthrough
case dns.RcodeFormatError:
fallthrough
case dns.RcodeNotImplemented:
return true
}
return false
}
const (
tcp = 0
udp = 1

View File

@@ -82,5 +82,21 @@ func NextOrFailure(name string, next Handler, ctx context.Context, w dns.Respons
return dns.RcodeServerFailure, Error(name, errors.New("no next middleware found"))
}
// ClientWrite returns true if the response has been written to the client.
// Each middleware to adhire to this protocol.
func ClientWrite(rcode int) bool {
switch rcode {
case dns.RcodeServerFailure:
fallthrough
case dns.RcodeRefused:
fallthrough
case dns.RcodeFormatError:
fallthrough
case dns.RcodeNotImplemented:
return false
}
return true
}
// Namespace is the namespace used for the metrics.
const Namespace = "coredns"