16561: Handle implicit port numbers in getListenAddress, add tests.
[arvados.git] / lib / service / cmd.go
index 5687ec1dadcddb3f3f6a1e3458a46eeca45dc990..9e45e0f7e828a340d5eee6d024eb9f8da21cf948 100644 (file)
@@ -241,10 +241,11 @@ func getListenAddr(svcs arvados.Services, prog arvados.ServiceName, log logrus.F
                return arvados.URL{}, arvados.URL{}, fmt.Errorf("unknown service name %q", prog)
        }
 
-       if want := os.Getenv("ARVADOS_SERVICE_INTERNAL_URL"); want == "" {
-       } else if url, err := url.Parse(want); err != nil {
-               return arvados.URL{}, arvados.URL{}, fmt.Errorf("$ARVADOS_SERVICE_INTERNAL_URL (%q): %s", want, err)
-       } else {
+       if want := os.Getenv("ARVADOS_SERVICE_INTERNAL_URL"); want != "" {
+               url, err := url.Parse(want)
+               if err != nil {
+                       return arvados.URL{}, arvados.URL{}, fmt.Errorf("$ARVADOS_SERVICE_INTERNAL_URL (%q): %s", want, err)
+               }
                if url.Path == "" {
                        url.Path = "/"
                }
@@ -272,7 +273,15 @@ func getListenAddr(svcs arvados.Services, prog arvados.ServiceName, log logrus.F
                        // intermediate proxy/routing)
                        listenURL = internalURL
                }
-               listener, err := net.Listen("tcp", listenURL.Host)
+               listenAddr := listenURL.Host
+               if _, _, err := net.SplitHostPort(listenAddr); err != nil {
+                       // url "https://foo.example/" (with no
+                       // explicit port name/number) means listen on
+                       // the well-known port for the specified
+                       // protocol, "foo.example:https".
+                       listenAddr = net.JoinHostPort(listenAddr, listenURL.Scheme)
+               }
+               listener, err := net.Listen("tcp", listenAddr)
                if err == nil {
                        listener.Close()
                        return listenURL, internalURL, nil