coredns/plugin/etcd/handler.go
Miek Gieben 53f3f0b666
Remove context.Context from request.Request ()
* Remove context.Context from request.Request

This removes the context from request.Request and makes all the changes
in the code to make it compile again. It's all mechanical. It did
unearth some weirdness in that the context was kept in handler structs
which may cause havoc with concurrently handling of requests.

Fixes 

Signed-off-by: Miek Gieben <miek@miek.nl>

* Make test compile

Signed-off-by: Miek Gieben <miek@miek.nl>
2019-03-26 14:37:30 +00:00

80 lines
2.2 KiB
Go

package etcd
import (
"context"
"github.com/coredns/coredns/plugin"
"github.com/coredns/coredns/request"
"github.com/miekg/dns"
)
// ServeDNS implements the plugin.Handler interface.
func (e *Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
opt := plugin.Options{}
state := request.Request{W: w, Req: r}
zone := plugin.Zones(e.Zones).Matches(state.Name())
if zone == "" {
return plugin.NextOrFailure(e.Name(), e.Next, ctx, w, r)
}
var (
records, extra []dns.RR
err error
)
switch state.QType() {
case dns.TypeA:
records, err = plugin.A(ctx, e, zone, state, nil, opt)
case dns.TypeAAAA:
records, err = plugin.AAAA(ctx, e, zone, state, nil, opt)
case dns.TypeTXT:
records, err = plugin.TXT(ctx, e, zone, state, opt)
case dns.TypeCNAME:
records, err = plugin.CNAME(ctx, e, zone, state, opt)
case dns.TypePTR:
records, err = plugin.PTR(ctx, e, zone, state, opt)
case dns.TypeMX:
records, extra, err = plugin.MX(ctx, e, zone, state, opt)
case dns.TypeSRV:
records, extra, err = plugin.SRV(ctx, e, zone, state, opt)
case dns.TypeSOA:
records, err = plugin.SOA(ctx, e, zone, state, opt)
case dns.TypeNS:
if state.Name() == zone {
records, extra, err = plugin.NS(ctx, e, zone, state, opt)
break
}
fallthrough
default:
// Do a fake A lookup, so we can distinguish between NODATA and NXDOMAIN
_, err = plugin.A(ctx, e, zone, state, nil, opt)
}
if err != nil && e.IsNameError(err) {
if e.Fall.Through(state.Name()) {
return plugin.NextOrFailure(e.Name(), e.Next, ctx, w, r)
}
// Make err nil when returning here, so we don't log spam for NXDOMAIN.
return plugin.BackendError(ctx, e, zone, dns.RcodeNameError, state, nil /* err */, opt)
}
if err != nil {
return plugin.BackendError(ctx, e, zone, dns.RcodeServerFailure, state, err, opt)
}
if len(records) == 0 {
return plugin.BackendError(ctx, e, zone, dns.RcodeSuccess, state, err, opt)
}
m := new(dns.Msg)
m.SetReply(r)
m.Authoritative = true
m.Answer = append(m.Answer, records...)
m.Extra = append(m.Extra, extra...)
w.WriteMsg(m)
return dns.RcodeSuccess, nil
}
// Name implements the Handler interface.
func (e *Etcd) Name() string { return "etcd" }