From 887d456ad443a041931830da7109c46000c634b8 Mon Sep 17 00:00:00 2001 From: Pijus Kamandulis Date: Mon, 3 Feb 2025 22:58:45 +0200 Subject: [PATCH] Return error code if server fails to start --- api/router.go | 39 ++++++++++++++++++++-------------- cmd/server/server.go | 5 ++++- sharedlibrary/shared.go | 1 + sharedlibrary/sharedlibrary.go | 5 ++++- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/api/router.go b/api/router.go index d776ded..f0f6b54 100644 --- a/api/router.go +++ b/api/router.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" "sync" + "time" "github.com/gin-gonic/gin" "github.com/pikami/cosmium/api/handlers" @@ -86,7 +87,7 @@ func (s *ApiServer) CreateRouter(repository *repositories.DataRepository) { s.router = router } -func (s *ApiServer) Start() { +func (s *ApiServer) Start() error { listenAddress := fmt.Sprintf(":%d", s.config.Port) s.isActive = true @@ -95,6 +96,8 @@ func (s *ApiServer) Start() { Handler: s.router.Handler(), } + errChan := make(chan error, 1) + go func() { <-s.stopServer logger.InfoLn("Shutting down server...") @@ -106,32 +109,36 @@ func (s *ApiServer) Start() { }() go func() { + var err error if s.config.DisableTls { logger.Infof("Listening and serving HTTP on %s\n", server.Addr) - err := server.ListenAndServe() - if err != nil && err != http.ErrServerClosed { - logger.ErrorLn("Failed to start HTTP server:", err) - } - s.isActive = false + err = server.ListenAndServe() } else if s.config.TLS_CertificatePath != "" && s.config.TLS_CertificateKey != "" { logger.Infof("Listening and serving HTTPS on %s\n", server.Addr) - err := server.ListenAndServeTLS( + err = server.ListenAndServeTLS( s.config.TLS_CertificatePath, s.config.TLS_CertificateKey) - if err != nil && err != http.ErrServerClosed { - logger.ErrorLn("Failed to start HTTPS server:", err) - } - s.isActive = false } else { tlsConfig := tlsprovider.GetDefaultTlsConfig() server.TLSConfig = tlsConfig logger.Infof("Listening and serving HTTPS on %s\n", server.Addr) - err := server.ListenAndServeTLS("", "") - if err != nil && err != http.ErrServerClosed { - logger.ErrorLn("Failed to start HTTPS server:", err) - } - s.isActive = false + err = server.ListenAndServeTLS("", "") } + + if err != nil && err != http.ErrServerClosed { + logger.ErrorLn("Failed to start server:", err) + errChan <- err + } else { + errChan <- nil + } + s.isActive = false }() + + select { + case err := <-errChan: + return err + case <-time.After(50 * time.Millisecond): + return nil + } } diff --git a/cmd/server/server.go b/cmd/server/server.go index 6b8bdae..6de6040 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -19,7 +19,10 @@ func main() { }) server := api.NewApiServer(repository, configuration) - server.Start() + err := server.Start() + if err != nil { + panic(err) + } waitForExit(server, repository, configuration) } diff --git a/sharedlibrary/shared.go b/sharedlibrary/shared.go index 1faed8b..707b8a1 100644 --- a/sharedlibrary/shared.go +++ b/sharedlibrary/shared.go @@ -25,6 +25,7 @@ const ( ResponseFailedToParseRequest = 103 ResponseServerInstanceAlreadyExists = 104 ResponseServerInstanceNotFound = 105 + ResponseFailedToStartServer = 106 ResponseRepositoryNotFound = 200 ResponseRepositoryConflict = 201 diff --git a/sharedlibrary/sharedlibrary.go b/sharedlibrary/sharedlibrary.go index 2791346..acfb87a 100644 --- a/sharedlibrary/sharedlibrary.go +++ b/sharedlibrary/sharedlibrary.go @@ -37,7 +37,10 @@ func CreateServerInstance(serverName *C.char, configurationJSON *C.char) int { }) server := api.NewApiServer(repository, configuration) - server.Start() + err = server.Start() + if err != nil { + return ResponseFailedToStartServer + } addInstance(serverNameStr, &ServerInstance{ server: server,