You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

23 lines
621 B

  1. package middleware
  2. import (
  3. "log/slog"
  4. "net/http"
  5. "runtime/debug"
  6. )
  7. // Recovery recovers from panics, logs the stack, and returns 500.
  8. func Recovery(next http.Handler) http.Handler {
  9. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  10. defer func() {
  11. if err := recover(); err != nil {
  12. slog.Error("panic recovered", "err", err, "stack", string(debug.Stack()))
  13. w.Header().Set("Content-Type", "application/json")
  14. w.WriteHeader(http.StatusInternalServerError)
  15. w.Write([]byte(`{"error":"internal_error","message":"internal server error"}`))
  16. }
  17. }()
  18. next.ServeHTTP(w, r)
  19. })
  20. }