16561: Handle implicit port number in ws:// and wss:// urls.
[arvados.git] / lib / service / cmd.go
index 5687ec1dadcddb3f3f6a1e3458a46eeca45dc990..04c3e170ec6e093bac2e701e51e06894aa42009c 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,19 @@ 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".
+                       port := listenURL.Scheme
+                       if port == "ws" || port == "wss" {
+                               port = "http" + port[2:]
+                       }
+                       listenAddr = net.JoinHostPort(listenAddr, port)
+               }
+               listener, err := net.Listen("tcp", listenAddr)
                if err == nil {
                        listener.Close()
                        return listenURL, internalURL, nil