package server import ( "context" "net/http" "os" "os/signal" "sync" "syscall" "time" "github.com/go-chi/chi/v5" log "github.com/sirupsen/logrus" "github.com/nais/wonderwall/pkg/config" ) var ( defaultTransport *http.Transport once sync.Once ) func DefaultTransport() *http.Transport { once.Do(func() { t := http.DefaultTransport.(*http.Transport).Clone() t.MaxIdleConns = 200 t.MaxIdleConnsPerHost = 100 t.IdleConnTimeout = 5 * time.Second defaultTransport = t }) return defaultTransport } func Start(cfg *config.Config, r chi.Router) error { server := http.Server{ Addr: cfg.BindAddress, Handler: r, } serverCtx, serverStopCtx := context.WithCancel(context.Background()) sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) go func() { <-sig shutdownCtx, shutdownStopCtx := context.WithTimeout(serverCtx, 20*time.Second) go func() { <-shutdownCtx.Done() if shutdownCtx.Err() == context.DeadlineExceeded { log.Fatal("graceful shutdown timed out.. forcing exit.") } }() err := server.Shutdown(shutdownCtx) if err != nil { log.Fatal(err) } shutdownStopCtx() serverStopCtx() }() err := server.ListenAndServe() if err != nil && err != http.ErrServerClosed { return err } <-serverCtx.Done() return nil }