| 
									
										
										
										
											2021-03-15 20:07:55 +05:30
										 |  |  | package minimal
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"context"
 | 
					
						
							|  |  |  | 	"fmt"
 | 
					
						
							|  |  |  | 	"time"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/plugin"
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/plugin/pkg/nonwriter"
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/plugin/pkg/response"
 | 
					
						
							| 
									
										
										
										
											2021-03-16 10:55:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-15 20:07:55 +05:30
										 |  |  | 	"github.com/miekg/dns"
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // minimalHandler implements the plugin.Handler interface.
 | 
					
						
							|  |  |  | type minimalHandler struct {
 | 
					
						
							|  |  |  | 	Next plugin.Handler
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (m *minimalHandler) Name() string { return "minimal" }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (m *minimalHandler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
 | 
					
						
							|  |  |  | 	nw := nonwriter.New(w)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rcode, err := plugin.NextOrFailure(m.Name(), m.Next, ctx, nw, r)
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							|  |  |  | 		return rcode, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ty, _ := response.Typify(nw.Msg, time.Now().UTC())
 | 
					
						
							|  |  |  | 	cl := response.Classify(ty)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// if response is Denial or Error pass through also if the type is Delegation pass through
 | 
					
						
							|  |  |  | 	if cl == response.Denial || cl == response.Error || ty == response.Delegation {
 | 
					
						
							|  |  |  | 		w.WriteMsg(nw.Msg)
 | 
					
						
							|  |  |  | 		return 0, nil
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	if ty != response.NoError {
 | 
					
						
							|  |  |  | 		w.WriteMsg(nw.Msg)
 | 
					
						
							|  |  |  | 		return 0, plugin.Error("minimal", fmt.Errorf("unhandled response type %q for %q", ty, nw.Msg.Question[0].Name))
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// copy over the original Msg params, deep copy not required as RRs are not modified
 | 
					
						
							|  |  |  | 	d := &dns.Msg{
 | 
					
						
							|  |  |  | 		MsgHdr:   nw.Msg.MsgHdr,
 | 
					
						
							|  |  |  | 		Compress: nw.Msg.Compress,
 | 
					
						
							|  |  |  | 		Question: nw.Msg.Question,
 | 
					
						
							|  |  |  | 		Answer:   nw.Msg.Answer,
 | 
					
						
							|  |  |  | 		Ns:       nil,
 | 
					
						
							|  |  |  | 		Extra:    nil,
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	w.WriteMsg(d)
 | 
					
						
							|  |  |  | 	return 0, nil
 | 
					
						
							|  |  |  | }
 |