You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
889 B

package internal
import (
"fmt"
"time"
"github.com/miekg/dns"
)
type Recursor struct {
Upstreams []string
Client *dns.Client
}
type Resolved struct {
RoundtripTime time.Duration
UpstreamUsed string
Attempts int
Message *dns.Msg
}
func (r Recursor) Resolve(request *dns.Msg) (Resolved, error) {
var result Resolved
errs := make([]error, 0, len(r.Upstreams))
var err error
var upstreamsTried int
for _, upstream := range r.Upstreams {
result.Message, result.RoundtripTime, err = r.Client.Exchange(request, upstream)
upstreamsTried++
if err == nil {
result.UpstreamUsed = upstream
result.Message.RecursionAvailable = true
break
}
errs = append(errs, err)
}
result.Attempts = upstreamsTried
if result.Message == nil && len(errs) > 0 {
return result, fmt.Errorf("errors occured resolving domain: %+v", errs)
}
return result, nil
}