53 lines
1020 B
Go
53 lines
1020 B
Go
package resolver
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
func ClassifyDNSError(err error) string {
|
|
if err == nil {
|
|
return "other"
|
|
}
|
|
var dnsErr *net.DNSError
|
|
if errors.As(err, &dnsErr) {
|
|
if dnsErr.IsNotFound {
|
|
return "nxdomain"
|
|
}
|
|
if dnsErr.IsTimeout {
|
|
return "timeout"
|
|
}
|
|
if dnsErr.IsTemporary {
|
|
return "temporary"
|
|
}
|
|
}
|
|
msg := strings.ToLower(err.Error())
|
|
switch {
|
|
case strings.Contains(msg, "no such host"), strings.Contains(msg, "nxdomain"):
|
|
return "nxdomain"
|
|
case strings.Contains(msg, "i/o timeout"), strings.Contains(msg, "timeout"):
|
|
return "timeout"
|
|
case strings.Contains(msg, "temporary"):
|
|
return "temporary"
|
|
default:
|
|
return "other"
|
|
}
|
|
}
|
|
|
|
func SplitDNS(dns string) (string, string) {
|
|
if strings.Contains(dns, "#") {
|
|
parts := strings.SplitN(dns, "#", 2)
|
|
host := strings.TrimSpace(parts[0])
|
|
port := strings.TrimSpace(parts[1])
|
|
if host == "" {
|
|
host = "127.0.0.1"
|
|
}
|
|
if port == "" {
|
|
port = "53"
|
|
}
|
|
return host, port
|
|
}
|
|
return strings.TrimSpace(dns), ""
|
|
}
|