aboutsummaryrefslogtreecommitdiff
path: root/core/dnsserver/middleware.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/dnsserver/middleware.go')
-rw-r--r--core/dnsserver/middleware.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/core/dnsserver/middleware.go b/core/dnsserver/middleware.go
new file mode 100644
index 000000000..5bce304b1
--- /dev/null
+++ b/core/dnsserver/middleware.go
@@ -0,0 +1,52 @@
+package dnsserver
+
+import (
+ "github.com/miekg/dns"
+ "golang.org/x/net/context"
+)
+
+type (
+ // Middleware is the middle layer which represents the traditional
+ // idea of middleware: it chains one Handler to the next by being
+ // passed the next Handler in the chain.
+ Middleware func(Handler) Handler
+
+ // Handler is like dns.Handler except ServeDNS may return an rcode
+ // and/or error.
+ //
+ // If ServeDNS writes to the response body, it should return a status
+ // code. If the status code is not one of the following:
+ // * SERVFAIL (dns.RcodeServerFailure)
+ // * REFUSED (dns.RecodeRefused)
+ // * FORMERR (dns.RcodeFormatError)
+ // * NOTIMP (dns.RcodeNotImplemented)
+ //
+ // CoreDNS assumes *no* reply has yet been written. All other response
+ // codes signal other handlers above it that the response message is
+ // already written, and that they should not write to it also.
+ //
+ // If ServeDNS encounters an error, it should return the error value
+ // so it can be logged by designated error-handling middleware.
+ //
+ // If writing a response after calling another ServeDNS method, the
+ // returned rcode SHOULD be used when writing the response.
+ //
+ // If handling errors after calling another ServeDNS method, the
+ // returned error value SHOULD be logged or handled accordingly.
+ //
+ // Otherwise, return values should be propagated down the middleware
+ // chain by returning them unchanged.
+ Handler interface {
+ ServeDNS(context.Context, dns.ResponseWriter, *dns.Msg) (int, error)
+ }
+
+ // HandlerFunc is a convenience type like dns.HandlerFunc, except
+ // ServeDNS returns an rcode and an error. See Handler
+ // documentation for more information.
+ HandlerFunc func(context.Context, dns.ResponseWriter, *dns.Msg) (int, error)
+)
+
+// ServeDNS implements the Handler interface.
+func (f HandlerFunc) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
+ return f(ctx, w, r)
+}