updated hws.ThrowError to not return an error and log it to console instead
fixed errors_test fixed tests
This commit is contained in:
@@ -26,14 +26,14 @@ type Server struct {
|
||||
}
|
||||
|
||||
// Ready returns a channel that is closed when the server is started
|
||||
func (server *Server) Ready() <-chan struct{} {
|
||||
return server.ready
|
||||
func (s *Server) Ready() <-chan struct{} {
|
||||
return s.ready
|
||||
}
|
||||
|
||||
// IsReady checks if the server is running
|
||||
func (server *Server) IsReady() bool {
|
||||
func (s *Server) IsReady() bool {
|
||||
select {
|
||||
case <-server.ready:
|
||||
case <-s.ready:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
@@ -41,13 +41,13 @@ func (server *Server) IsReady() bool {
|
||||
}
|
||||
|
||||
// Addr returns the server's network address
|
||||
func (server *Server) Addr() string {
|
||||
return server.server.Addr
|
||||
func (s *Server) Addr() string {
|
||||
return s.server.Addr
|
||||
}
|
||||
|
||||
// Handler returns the server's HTTP handler for testing purposes
|
||||
func (server *Server) Handler() http.Handler {
|
||||
return server.server.Handler
|
||||
func (s *Server) Handler() http.Handler {
|
||||
return s.server.Handler
|
||||
}
|
||||
|
||||
// NewServer returns a new hws.Server with the specified configuration.
|
||||
@@ -75,7 +75,7 @@ func NewServer(config *Config) (*Server, error) {
|
||||
|
||||
valid := isValidHostname(config.Host)
|
||||
if !valid {
|
||||
return nil, fmt.Errorf("Hostname '%s' is not valid", config.Host)
|
||||
return nil, fmt.Errorf("hostname '%s' is not valid", config.Host)
|
||||
}
|
||||
|
||||
httpServer := &http.Server{
|
||||
@@ -95,62 +95,64 @@ func NewServer(config *Config) (*Server, error) {
|
||||
return server, nil
|
||||
}
|
||||
|
||||
func (server *Server) Start(ctx context.Context) error {
|
||||
func (s *Server) Start(ctx context.Context) error {
|
||||
if ctx == nil {
|
||||
return errors.New("Context cannot be nil")
|
||||
}
|
||||
if !server.routes {
|
||||
if !s.routes {
|
||||
return errors.New("Server.AddRoutes must be run before starting the server")
|
||||
}
|
||||
if !server.middleware {
|
||||
err := server.AddMiddleware()
|
||||
if !s.middleware {
|
||||
err := s.AddMiddleware()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "server.AddMiddleware")
|
||||
}
|
||||
}
|
||||
|
||||
server.startNotifier()
|
||||
s.startNotifier()
|
||||
|
||||
go func() {
|
||||
if server.logger == nil {
|
||||
fmt.Printf("Listening for requests on %s", server.server.Addr)
|
||||
if s.logger == nil {
|
||||
fmt.Printf("Listening for requests on %s", s.server.Addr)
|
||||
} else {
|
||||
server.logger.logger.Info().Str("address", server.server.Addr).Msg("Listening for requests")
|
||||
s.logger.logger.Info().Str("address", s.server.Addr).Msg("Listening for requests")
|
||||
}
|
||||
if err := server.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||
if server.logger == nil {
|
||||
if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||
if s.logger == nil {
|
||||
fmt.Printf("Server encountered a fatal error: %s", err.Error())
|
||||
} else {
|
||||
server.LogError(HWSError{Error: err, Message: "Server encountered a fatal error"})
|
||||
s.LogError(HWSError{Error: err, Message: "Server encountered a fatal error"})
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
server.waitUntilReady(ctx)
|
||||
s.waitUntilReady(ctx)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (server *Server) Shutdown(ctx context.Context) error {
|
||||
server.logger.logger.Debug().Dur("shutdown_delay", server.shutdowndelay).Msg("HWS Server shutting down")
|
||||
server.NotifyAll(notify.Notification{
|
||||
func (s *Server) Shutdown(ctx context.Context) error {
|
||||
if s.logger != nil {
|
||||
s.logger.logger.Debug().Dur("shutdown_delay", s.shutdowndelay).Msg("HWS Server shutting down")
|
||||
}
|
||||
s.NotifyAll(notify.Notification{
|
||||
Title: "Shutting down",
|
||||
Message: fmt.Sprintf("Server is shutting down in %v", server.shutdowndelay),
|
||||
Message: fmt.Sprintf("Server is shutting down in %v", s.shutdowndelay),
|
||||
Level: LevelShutdown,
|
||||
})
|
||||
<-time.NewTimer(server.shutdowndelay).C
|
||||
if !server.IsReady() {
|
||||
<-time.NewTimer(s.shutdowndelay).C
|
||||
if !s.IsReady() {
|
||||
return errors.New("Server isn't running")
|
||||
}
|
||||
if ctx == nil {
|
||||
return errors.New("Context cannot be nil")
|
||||
}
|
||||
err := server.server.Shutdown(ctx)
|
||||
err := s.server.Shutdown(ctx)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Failed to shutdown the server gracefully")
|
||||
}
|
||||
server.closeNotifier()
|
||||
server.ready = make(chan struct{})
|
||||
s.closeNotifier()
|
||||
s.ready = make(chan struct{})
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -168,7 +170,7 @@ func isValidHostname(host string) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (server *Server) waitUntilReady(ctx context.Context) error {
|
||||
func (s *Server) waitUntilReady(ctx context.Context) error {
|
||||
ticker := time.NewTicker(50 * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
|
||||
@@ -180,14 +182,14 @@ func (server *Server) waitUntilReady(ctx context.Context) error {
|
||||
return ctx.Err()
|
||||
|
||||
case <-ticker.C:
|
||||
resp, err := http.Get("http://" + server.server.Addr + "/healthz")
|
||||
resp, err := http.Get("http://" + s.server.Addr + "/healthz")
|
||||
if err != nil {
|
||||
continue // not accepting yet
|
||||
}
|
||||
resp.Body.Close()
|
||||
|
||||
if resp.StatusCode == http.StatusOK {
|
||||
closeOnce.Do(func() { close(server.ready) })
|
||||
closeOnce.Do(func() { close(s.ready) })
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user