fix(web): align wildcard advertise IP preference

This commit is contained in:
lc6464
2026-04-14 15:17:27 +08:00
parent ae195831bb
commit 24382271d6
2 changed files with 56 additions and 8 deletions
+39 -5
View File
@@ -124,15 +124,49 @@ func hasWildcardBindHosts(bindHosts []string) bool {
return false
}
func wildcardAdvertiseIP(bindHosts []string, ipv4, ipv6 string) string {
if !hasWildcardBindHosts(bindHosts) {
return ""
func wildcardBindHostFamilies(bindHosts []string) (hasIPv4, hasIPv6 bool) {
for _, bindHost := range bindHosts {
host := strings.TrimSpace(bindHost)
if host == "" {
continue
}
if !netbind.IsUnspecifiedHost(host) {
continue
}
ip := net.ParseIP(strings.Trim(host, "[]"))
if ip == nil {
continue
}
if ip.To4() != nil {
hasIPv4 = true
continue
}
hasIPv6 = true
}
if v6 := strings.TrimSpace(ipv6); v6 != "" {
return hasIPv4, hasIPv6
}
func wildcardAdvertiseIP(bindHosts []string, ipv4, ipv6 string) string {
hasIPv4Wildcard, hasIPv6Wildcard := wildcardBindHostFamilies(bindHosts)
v4 := strings.TrimSpace(ipv4)
v6 := strings.TrimSpace(ipv6)
switch {
case hasIPv4Wildcard && hasIPv6Wildcard:
if v6 != "" {
return v6
}
return v4
case hasIPv6Wildcard:
return v6
case hasIPv4Wildcard:
return v4
default:
return ""
}
return strings.TrimSpace(ipv4)
}
func advertiseIPForWildcardBindHosts(bindHosts []string) string {
+17 -3
View File
@@ -250,10 +250,17 @@ func TestWildcardAdvertiseIP(t *testing.T) {
want string
}{
{
name: "ipv4 wildcard prefers ipv6 when available",
name: "ipv4 wildcard uses ipv4",
bindHosts: []string{"0.0.0.0"},
ipv4: "192.168.1.2",
ipv6: "2001:db8::1",
want: "192.168.1.2",
},
{
name: "dual wildcard prefers ipv6",
bindHosts: []string{"0.0.0.0", "::"},
ipv4: "192.168.1.2",
ipv6: "2001:db8::1",
want: "2001:db8::1",
},
{
@@ -264,12 +271,19 @@ func TestWildcardAdvertiseIP(t *testing.T) {
want: "2001:db8::1",
},
{
name: "ipv6 wildcard falls back to ipv4",
bindHosts: []string{"::"},
name: "dual wildcard falls back to ipv4 when ipv6 missing",
bindHosts: []string{"0.0.0.0", "::"},
ipv4: "192.168.1.2",
ipv6: "",
want: "192.168.1.2",
},
{
name: "ipv6 wildcard without ipv6 does not advertise ipv4",
bindHosts: []string{"::"},
ipv4: "192.168.1.2",
ipv6: "",
want: "",
},
{
name: "non wildcard does not advertise",
bindHosts: []string{"127.0.0.1"},