diff options
Diffstat (limited to 'core/dnsserver/middleware.go')
-rw-r--r-- | core/dnsserver/middleware.go | 52 |
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) +} |