From 9fd027fcdaf79f652df5478295bdd6c8647c0542 Mon Sep 17 00:00:00 2001 From: Christian Galo Date: Sun, 20 Apr 2025 23:45:44 -0500 Subject: [PATCH] Add recovery middleware to handle panics and log errors --- cmd/start.go | 3 ++- internal/middleware/recover.go | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 internal/middleware/recover.go diff --git a/cmd/start.go b/cmd/start.go index 0d7765e..6524684 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -36,6 +36,7 @@ var startCmd = &cobra.Command{ // Create middleware stack stack := middleware.CreateStack( + middleware.Recovery(), // Add recovery middleware first to catch all panics middleware.SecureHeaders, middleware.Logging, middleware.MaxBodySize(1024*1024), // 1MB size limit @@ -74,4 +75,4 @@ func init() { // Add the command to the root command rootCmd.AddCommand(startCmd) -} +} \ No newline at end of file diff --git a/internal/middleware/recover.go b/internal/middleware/recover.go new file mode 100644 index 0000000..744f79e --- /dev/null +++ b/internal/middleware/recover.go @@ -0,0 +1,27 @@ +package middleware + +import ( + "log" + "net/http" + "runtime/debug" +) + +// Recovery middleware to catch panics, log them, and return a 500 error +func Recovery() Middleware { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { + if err := recover(); err != nil { + // Log the stack trace + log.Printf("PANIC: %v\n%s", err, debug.Stack()) + + // Return a 500 Internal Server Error response + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte("Internal Server Error")) + } + }() + + next.ServeHTTP(w, r) + }) + } +} \ No newline at end of file