diff --git a/_examples/advanced-generic-openapi31/main.go b/_examples/advanced-generic-openapi31/main.go index 3112630..6b31471 100644 --- a/_examples/advanced-generic-openapi31/main.go +++ b/_examples/advanced-generic-openapi31/main.go @@ -3,13 +3,47 @@ package main import ( + "context" + "errors" "log" "net/http" + "os" + "os/signal" + "time" ) func main() { + var srv http.Server + + idleConnsClosed := make(chan struct{}) + go func() { + sigint := make(chan os.Signal, 1) + signal.Notify(sigint, os.Interrupt) + <-sigint + + log.Println("Shutting down...") + + // We received an interrupt signal, shut down with up to 10 seconds of waiting for current requests to finish. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + if err := srv.Shutdown(ctx); err != nil { + // Error from closing listeners, or context timeout: + log.Printf("HTTP server Shutdown: %v", err) + } + log.Println("Shutdown complete") + + close(idleConnsClosed) + }() + + srv.Handler = NewRouter() + srv.Addr = "localhost:8012" + log.Println("http://localhost:8012/docs") - if err := http.ListenAndServe("localhost:8012", NewRouter()); err != nil { - log.Fatal(err) + if err := srv.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { + // Error starting or closing listener: + log.Fatalf("HTTP server ListenAndServe: %v", err) } + + <-idleConnsClosed }