From f20e151cfa6c9834e6a0a37ba233636ef2149402 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Mon, 25 May 2026 21:54:54 +0800 Subject: [PATCH] refactor(resolver): extract preference constants and shouldReturn helper Replace 10 raw "ipv4"/"ipv6" string literals with preferIPv4/preferIPv6 constants, extract the duplicated fallback-condition check (repeated 4x across resolve and lookupCache) into shouldReturn, and fix a misleading doc comment on resolvePreference's default return. --- resolver/resolver.go | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/resolver/resolver.go b/resolver/resolver.go index 03f4c210..cead222e 100644 --- a/resolver/resolver.go +++ b/resolver/resolver.go @@ -56,7 +56,12 @@ func LoggerOption(logger logger.Logger) Option { } } -const maxAsyncRefresh = 32 // max concurrent background refresh goroutines +const ( + maxAsyncRefresh = 32 // max concurrent background refresh goroutines + + preferIPv4 = "ipv4" + preferIPv6 = "ipv6" +) // localResolver resolves hostnames via DNS using configured nameservers and a cache. type localResolver struct { @@ -101,11 +106,11 @@ func NewResolver(nameservers []NameServer, opts ...Option) (resolver.Resolver, e switch server.Only { case "ip4", "ipv4": - server.Only = "ipv4" - server.Prefer = "ipv4" + server.Only = preferIPv4 + server.Prefer = preferIPv4 case "ip6", "ipv6": - server.Only = "ipv6" - server.Prefer = "ipv6" + server.Only = preferIPv6 + server.Prefer = preferIPv6 default: server.Only = "" } @@ -130,9 +135,9 @@ func NewResolver(nameservers []NameServer, opts ...Option) (resolver.Resolver, e func callerNetworkPref(network string) string { switch network { case "ip4": - return "ipv4" + return preferIPv4 case "ip6": - return "ipv6" + return preferIPv6 default: return "" } @@ -183,7 +188,14 @@ func resolvePreference(server *NameServer, callerPref string) string { if server.Prefer != "" { return server.Prefer } - return "" // default: ipv4-first + return "" +} + +// shouldReturn reports whether results from the given address family should be +// accepted without falling back to the other family. Returns true when results +// were found, or when a hard constraint (Only or caller network) pins to this family. +func shouldReturn(ips []net.IP, server *NameServer, callerPref, family string) bool { + return len(ips) > 0 || server.Only == family || callerPref == family } func (r *localResolver) resolve(ctx context.Context, server *NameServer, host string, callerPref string) (ips []net.IP, err error) { @@ -193,14 +205,14 @@ func (r *localResolver) resolve(ctx context.Context, server *NameServer, host st pref := resolvePreference(server, callerPref) - if pref == "ipv6" { - if ips, err = r.resolve6(ctx, server, host); len(ips) > 0 || server.Only == "ipv6" || callerPref == "ipv6" { + if pref == preferIPv6 { + if ips, err = r.resolve6(ctx, server, host); shouldReturn(ips, server, callerPref, preferIPv6) { return } return r.resolve4(ctx, server, host) } - if ips, err = r.resolve4(ctx, server, host); len(ips) > 0 || server.Only == "ipv4" || callerPref == "ipv4" { + if ips, err = r.resolve4(ctx, server, host); shouldReturn(ips, server, callerPref, preferIPv4) { return } return r.resolve6(ctx, server, host) @@ -242,9 +254,9 @@ func (r *localResolver) lookupCache(ctx context.Context, server *NameServer, hos pref := resolvePreference(server, callerPref) - if pref == "ipv6" { + if pref == preferIPv6 { ips, ttl, ok = lookup(dns.TypeAAAA, host) - if len(ips) > 0 || server.Only == "ipv6" || callerPref == "ipv6" { + if shouldReturn(ips, server, callerPref, preferIPv6) { return } ips, ttl, ok = lookup(dns.TypeA, host) @@ -252,7 +264,7 @@ func (r *localResolver) lookupCache(ctx context.Context, server *NameServer, hos } ips, ttl, ok = lookup(dns.TypeA, host) - if len(ips) > 0 || server.Only == "ipv4" || callerPref == "ipv4" { + if shouldReturn(ips, server, callerPref, preferIPv4) { return } return lookup(dns.TypeAAAA, host)