Compare commits
2 Commits
2993911883
...
b599dab525
| Author | SHA1 | Date | |
|---|---|---|---|
| b599dab525 | |||
|
|
9193cb1bca |
@@ -480,6 +480,7 @@ type queryState struct {
|
||||
gotNXDomain bool
|
||||
gotSERVFAIL bool
|
||||
gotTimeout bool
|
||||
gotError bool
|
||||
hasRecords bool
|
||||
}
|
||||
|
||||
@@ -517,8 +518,11 @@ func (r *Resolver) querySingleType(
|
||||
) {
|
||||
msg, err := r.queryDNS(ctx, nsIP, hostname, qtype)
|
||||
if err != nil {
|
||||
if isTimeout(err) {
|
||||
var netErr net.Error
|
||||
if errors.As(err, &netErr) && netErr.Timeout() {
|
||||
state.gotTimeout = true
|
||||
} else {
|
||||
state.gotError = true
|
||||
}
|
||||
|
||||
return
|
||||
@@ -558,16 +562,6 @@ func collectAnswerRecords(
|
||||
}
|
||||
}
|
||||
|
||||
// isTimeout checks whether an error is a network timeout.
|
||||
func isTimeout(err error) bool {
|
||||
var netErr net.Error
|
||||
if errors.As(err, &netErr) {
|
||||
return netErr.Timeout()
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func classifyResponse(resp *NameserverResponse, state queryState) {
|
||||
switch {
|
||||
case state.gotNXDomain && !state.hasRecords:
|
||||
@@ -575,14 +569,22 @@ func classifyResponse(resp *NameserverResponse, state queryState) {
|
||||
case state.gotTimeout && !state.hasRecords:
|
||||
resp.Status = StatusTimeout
|
||||
resp.Error = "all queries timed out"
|
||||
case state.gotSERVFAIL && !state.hasRecords:
|
||||
case (state.gotError || state.gotSERVFAIL) && !state.hasRecords:
|
||||
resp.Status = StatusError
|
||||
resp.Error = "server returned SERVFAIL"
|
||||
resp.Error = errorMessageForState(state)
|
||||
case !state.hasRecords && !state.gotNXDomain:
|
||||
resp.Status = StatusNoData
|
||||
}
|
||||
}
|
||||
|
||||
func errorMessageForState(state queryState) string {
|
||||
if state.gotSERVFAIL {
|
||||
return "server returned SERVFAIL"
|
||||
}
|
||||
|
||||
return "query failed due to non-timeout error"
|
||||
}
|
||||
|
||||
// extractRecordValue formats a DNS RR value as a string.
|
||||
func extractRecordValue(rr dns.RR) string {
|
||||
switch r := rr.(type) {
|
||||
|
||||
Reference in New Issue
Block a user