fix(web): align wildcard advertise IP preference
This commit is contained in:
parent
ae195831bb
commit
24382271d6
2 changed files with 56 additions and 8 deletions
|
|
@ -124,15 +124,49 @@ func hasWildcardBindHosts(bindHosts []string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func wildcardAdvertiseIP(bindHosts []string, ipv4, ipv6 string) string {
|
func wildcardBindHostFamilies(bindHosts []string) (hasIPv4, hasIPv6 bool) {
|
||||||
if !hasWildcardBindHosts(bindHosts) {
|
for _, bindHost := range bindHosts {
|
||||||
return ""
|
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
|
return v6
|
||||||
|
case hasIPv4Wildcard:
|
||||||
|
return v4
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
}
|
}
|
||||||
return strings.TrimSpace(ipv4)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func advertiseIPForWildcardBindHosts(bindHosts []string) string {
|
func advertiseIPForWildcardBindHosts(bindHosts []string) string {
|
||||||
|
|
|
||||||
|
|
@ -250,10 +250,17 @@ func TestWildcardAdvertiseIP(t *testing.T) {
|
||||||
want string
|
want string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "ipv4 wildcard prefers ipv6 when available",
|
name: "ipv4 wildcard uses ipv4",
|
||||||
bindHosts: []string{"0.0.0.0"},
|
bindHosts: []string{"0.0.0.0"},
|
||||||
ipv4: "192.168.1.2",
|
ipv4: "192.168.1.2",
|
||||||
ipv6: "2001:db8::1",
|
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",
|
want: "2001:db8::1",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -264,12 +271,19 @@ func TestWildcardAdvertiseIP(t *testing.T) {
|
||||||
want: "2001:db8::1",
|
want: "2001:db8::1",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ipv6 wildcard falls back to ipv4",
|
name: "dual wildcard falls back to ipv4 when ipv6 missing",
|
||||||
bindHosts: []string{"::"},
|
bindHosts: []string{"0.0.0.0", "::"},
|
||||||
ipv4: "192.168.1.2",
|
ipv4: "192.168.1.2",
|
||||||
ipv6: "",
|
ipv6: "",
|
||||||
want: "192.168.1.2",
|
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",
|
name: "non wildcard does not advertise",
|
||||||
bindHosts: []string{"127.0.0.1"},
|
bindHosts: []string{"127.0.0.1"},
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue