check / check (push) Canceled after 0s
dnswatcher never asks for recursion, so a reply marked recursion available comes from a resolver on the network answering in the server's place, as on a network that sends all DNS to one resolver. Such a resolver answers only from its cache, or with SERVFAIL or REFUSED, which made make check fail there. A reply over UDP marked so is now asked again over TCP, which many such networks leave alone, and the TCP reply is used. A reply from a root server's address still marked so is not used, and when every root server refuses or gives one, the error is the existing "this network intercepts DNS queries". Model: opus-5-5
87 lines
2.8 KiB
Go
87 lines
2.8 KiB
Go
package resolver
|
|
|
|
import "errors"
|
|
|
|
// NoAnswerError is returned when the walk to a name's nameservers
|
|
// reached a zone through a referral and none of that zone's
|
|
// nameservers, Nameservers as the referral names them, answered. Err
|
|
// says why they did not.
|
|
type NoAnswerError struct {
|
|
Nameservers []string
|
|
Err error
|
|
}
|
|
|
|
func (e *NoAnswerError) Error() string {
|
|
return e.Err.Error()
|
|
}
|
|
|
|
func (e *NoAnswerError) Unwrap() error {
|
|
return e.Err
|
|
}
|
|
|
|
// Sentinel errors returned by the resolver.
|
|
var (
|
|
// ErrNoNameservers is returned when no authoritative NS
|
|
// could be discovered for a domain.
|
|
ErrNoNameservers = errors.New(
|
|
"no authoritative nameservers found",
|
|
)
|
|
|
|
// ErrNXDomain is returned when the servers of the zone a domain
|
|
// is in answer NXDOMAIN: the domain does not exist.
|
|
ErrNXDomain = errors.New("domain does not exist")
|
|
|
|
// ErrNoNameserverAnswered is returned when every nameserver
|
|
// asked about a name timed out, failed or returned a referral,
|
|
// so whether the name has addresses is unknown.
|
|
ErrNoNameserverAnswered = errors.New("no nameserver answered")
|
|
|
|
// ErrNoNameserverAddress is returned when a nameserver is to be
|
|
// asked and no address for it was given.
|
|
ErrNoNameserverAddress = errors.New("nameserver has no address")
|
|
|
|
// ErrUnusableReply is returned when a server replied with an
|
|
// error such as SERVFAIL, or with a referral that leads no
|
|
// closer to the name asked about.
|
|
ErrUnusableReply = errors.New(
|
|
"reply is an error or a referral that leads no closer",
|
|
)
|
|
|
|
// ErrTruncated is the reason given for a reply too large for UDP
|
|
// whose retry over TCP failed.
|
|
ErrTruncated = errors.New(
|
|
"reply truncated and its retry over TCP failed",
|
|
)
|
|
|
|
// ErrRecursionAvailable is the reason a reply from a root server
|
|
// marked recursion available is not used. Root servers offer no
|
|
// recursion, so the reply came from something on the network
|
|
// answering in their place.
|
|
ErrRecursionAvailable = errors.New(
|
|
"reply marked recursion available, so not from a root server",
|
|
)
|
|
|
|
// ErrIntercepted is returned when every root server refused a
|
|
// query or gave a reply marked recursion available. Root servers do
|
|
// neither, so those replies came from something on the network
|
|
// answering in their place.
|
|
ErrIntercepted = errors.New("this network intercepts DNS queries")
|
|
|
|
// ErrCNAMEDepthExceeded is returned when a CNAME chain
|
|
// exceeds MaxCNAMEDepth.
|
|
ErrCNAMEDepthExceeded = errors.New(
|
|
"CNAME chain depth exceeded",
|
|
)
|
|
|
|
// ErrLookupDepthExceeded is returned when nameserver addresses
|
|
// were not looked up because lookups were already maxLookupDepth
|
|
// deep, one inside another.
|
|
ErrLookupDepthExceeded = errors.New(
|
|
"lookups of nameserver addresses go too deep",
|
|
)
|
|
|
|
// ErrContextCanceled wraps context cancellation for the
|
|
// resolver's iterative queries.
|
|
ErrContextCanceled = errors.New("context canceled")
|
|
)
|