diff --git a/listeners.go b/listeners.go index 46446420a..e52561dcf 100644 --- a/listeners.go +++ b/listeners.go @@ -266,9 +266,18 @@ type ParsedAddress struct { EndPort uint } +// IsUnixNetwork returns true if pa.Network is +// unix, unixgram, or unixpacket. +func (pa ParsedAddress) IsUnixNetwork() bool { + return isUnixNetwork(pa.Network) +} + // JoinHostPort is like net.JoinHostPort, but where the port // is StartPort + offset. func (pa ParsedAddress) JoinHostPort(offset uint) string { + if pa.IsUnixNetwork() { + return pa.Host + } return net.JoinHostPort(pa.Host, strconv.Itoa(int(pa.StartPort+offset))) } @@ -290,6 +299,10 @@ func (pa ParsedAddress) String() string { return JoinNetworkAddress(pa.Network, pa.Host, port) } +func isUnixNetwork(netw string) bool { + return netw == "unix" || netw == "unixgram" || netw == "unixpacket" +} + // ParseNetworkAddress parses addr into its individual // components. The input string is expected to be of // the form "network/host:port-range" where any part is @@ -307,7 +320,7 @@ func ParseNetworkAddress(addr string) (ParsedAddress, error) { if err != nil { return ParsedAddress{}, err } - if network == "unix" || network == "unixgram" || network == "unixpacket" { + if isUnixNetwork(network) { return ParsedAddress{ Network: network, Host: host, diff --git a/listeners_test.go b/listeners_test.go index 076b36558..25e1394a6 100644 --- a/listeners_test.go +++ b/listeners_test.go @@ -250,3 +250,52 @@ func TestParseNetworkAddress(t *testing.T) { } } } + +func TestJoinHostPort(t *testing.T) { + for i, tc := range []struct { + pa ParsedAddress + offset uint + expect string + }{ + { + pa: ParsedAddress{ + Network: "tcp", + Host: "localhost", + StartPort: 1234, + EndPort: 1234, + }, + expect: "localhost:1234", + }, + { + pa: ParsedAddress{ + Network: "tcp", + Host: "localhost", + StartPort: 1234, + EndPort: 1235, + }, + expect: "localhost:1234", + }, + { + pa: ParsedAddress{ + Network: "tcp", + Host: "localhost", + StartPort: 1234, + EndPort: 1235, + }, + offset: 1, + expect: "localhost:1235", + }, + { + pa: ParsedAddress{ + Network: "unix", + Host: "/run/php/php7.3-fpm.sock", + }, + expect: "/run/php/php7.3-fpm.sock", + }, + } { + actual := tc.pa.JoinHostPort(tc.offset) + if actual != tc.expect { + t.Errorf("Test %d: Expected '%s' but got '%s'", i, tc.expect, actual) + } + } +}