diff --git a/go-gost/x/socket/preconn_manager.go b/go-gost/x/socket/preconn_manager.go index 346812d..441f18b 100644 --- a/go-gost/x/socket/preconn_manager.go +++ b/go-gost/x/socket/preconn_manager.go @@ -164,7 +164,9 @@ func parseListenAddr(addr string) (string, string, error) { if err != nil { return "", "", err } - if host == "" || host == "0.0.0.0" || host == "::" { + if host == "" || host == "0.0.0.0" { + // Keep the legacy empty-host behavior mapped to IPv4 wildcard, but + // preserve an explicit "::" so dual-stack listeners stay IPv6-capable. host = "0.0.0.0" } return host, port, nil diff --git a/go-gost/x/socket/preconn_manager_test.go b/go-gost/x/socket/preconn_manager_test.go new file mode 100644 index 0000000..60c34d1 --- /dev/null +++ b/go-gost/x/socket/preconn_manager_test.go @@ -0,0 +1,52 @@ +package socket + +import "testing" + +func TestParseListenAddr(t *testing.T) { + tests := []struct { + name string + addr string + wantHost string + wantPort string + }{ + { + name: "defaults empty host to ipv4 wildcard", + addr: ":32000", + wantHost: "0.0.0.0", + wantPort: "32000", + }, + { + name: "keeps ipv4 wildcard", + addr: "0.0.0.0:32001", + wantHost: "0.0.0.0", + wantPort: "32001", + }, + { + name: "keeps ipv6 wildcard", + addr: "[::]:32002", + wantHost: "::", + wantPort: "32002", + }, + { + name: "keeps specific ipv6 address", + addr: "[2001:db8::1]:32003", + wantHost: "2001:db8::1", + wantPort: "32003", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotHost, gotPort, err := parseListenAddr(tt.addr) + if err != nil { + t.Fatalf("parseListenAddr returned error: %v", err) + } + if gotHost != tt.wantHost { + t.Fatalf("expected host %q, got %q", tt.wantHost, gotHost) + } + if gotPort != tt.wantPort { + t.Fatalf("expected port %q, got %q", tt.wantPort, gotPort) + } + }) + } +}