// SPDX-License-Identifier: Apache-2.0 // Package netutil holds tiny networking helpers shared across cmd/ // binaries. Kept deliberately minimal — anything more involved than a // few lines belongs in its own package. package netutil import ( "net" "strings" ) // EnsurePort returns addr unchanged when it already carries a port, or // addr with ":" appended otherwise. Bare IPv6 literals // ("2001:db8::1", "::1") are bracketed so the result is valid input to // grpc.NewClient and net.Dial. An empty addr is returned unchanged. func EnsurePort(addr, defaultPort string) string { if addr == "" { return addr } if _, _, err := net.SplitHostPort(addr); err == nil { return addr } // Already-bracketed bare IPv6 ("[::1]") falls through to the plain // concat at the bottom. Unbracketed IPv6 needs brackets first; we // detect it by handing the literal to net.ParseIP, which only // accepts the bare form (no brackets, no port). if ip := net.ParseIP(addr); ip != nil && ip.To4() == nil && strings.Contains(addr, ":") { return "[" + addr + "]:" + defaultPort } return addr + ":" + defaultPort }