@@ 15,7 15,9 @@ import (
"log/slog"
"net/http"
"os"
+ "os/signal"
"strings"
+ "syscall"
"time"
"git.xenrox.net/~xenrox/go-utils/logging"
@@ 132,6 134,9 @@ func main() {
os.Exit(1)
}
+ ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
+ defer stop()
+
// TODO: Remove
// NOTE: Disable HTTP/2
// Programs that must disable HTTP/2 can do so by setting Transport.TLSNextProto (for clients) to a non-nil, empty map.
@@ 156,11 161,25 @@ func main() {
ReadTimeout: 60 * time.Second,
}
- err = srv.ListenAndServe()
+ go func() {
+ err = srv.ListenAndServe()
+ if err != nil && err != http.ErrServerClosed {
+ logger.Error("Failed to start HTTP server",
+ slog.String("error", err.Error()))
+ os.Exit(1)
+ }
+ }()
+
+ <-ctx.Done()
+ stop()
+
+ httpShutdownContext, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+
+ err = srv.Shutdown(httpShutdownContext)
if err != nil {
- logger.Error("Failed to start HTTP server",
+ logger.Error("Failed to shutdown HTTP sever",
slog.String("error", err.Error()))
- os.Exit(1)
}
}