mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
fix(web): align wildcard advertise IP preference
This commit is contained in:
+39
-5
@@ -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 {
|
||||
|
||||
@@ -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"},
|
||||
|
||||
Reference in New Issue
Block a user