Return error code if server fails to start

This commit is contained in:
Pijus Kamandulis 2025-02-03 22:58:45 +02:00
parent da1566875b
commit 887d456ad4
4 changed files with 32 additions and 18 deletions

View File

@ -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
}
}

View File

@ -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)
}

View File

@ -25,6 +25,7 @@ const (
ResponseFailedToParseRequest = 103
ResponseServerInstanceAlreadyExists = 104
ResponseServerInstanceNotFound = 105
ResponseFailedToStartServer = 106
ResponseRepositoryNotFound = 200
ResponseRepositoryConflict = 201

View File

@ -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,