aboutsummaryrefslogtreecommitdiff
path: root/plugin/minimal/minimal.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/minimal/minimal.go')
-rw-r--r--plugin/minimal/minimal.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/plugin/minimal/minimal.go b/plugin/minimal/minimal.go
new file mode 100644
index 000000000..6b5a7a731
--- /dev/null
+++ b/plugin/minimal/minimal.go
@@ -0,0 +1,54 @@
+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"
+ "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
+}