Skip to content

Instantly share code, notes, and snippets.

@cnnrrss
Created February 3, 2024 19:00
Show Gist options
  • Save cnnrrss/a243db51ab8dacab5f9b3da5e3e26cb5 to your computer and use it in GitHub Desktop.
Save cnnrrss/a243db51ab8dacab5f9b3da5e3e26cb5 to your computer and use it in GitHub Desktop.
Simple http server
package main
import (
"context"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
s := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
slog.Info("server received request", "status", http.StatusOK)
w.WriteHeader(200)
}),
}
go func() {
_ = s.ListenAndServe()
}()
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
slog.Info("server received shutdown signal")
// Graceful shutdown period
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := s.Shutdown(ctx); err != nil {
slog.Error("server Shutdown() failed", "err", err)
return
}
select {
case <-ctx.Done():
slog.Info("server shutdown timeout 5 seconds")
}
slog.Info("server exiting")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment