From 7057f89038160022c96e8c273a008a86b4de9f28 Mon Sep 17 00:00:00 2001 From: Maxime Delporte Date: Thu, 23 Oct 2025 14:19:53 +0200 Subject: [PATCH] Creating recoverPanic method inside our middleware.go file and use it inside routes.go wrapping our router. --- cmd/api/middleware.go | 24 ++++++++++++++++++++++++ cmd/api/routes.go | 3 ++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 cmd/api/middleware.go diff --git a/cmd/api/middleware.go b/cmd/api/middleware.go new file mode 100644 index 0000000..03fe91f --- /dev/null +++ b/cmd/api/middleware.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "net/http" +) + +func (app *application) recoverPanic(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Create a deferred function (which will always be run in the event of a panic as Go unwinds the stack). + defer func() { + // Use the builtin recover function to check if there has been a panic or not. + if err := recover(); err != nil { + // If there was a panic, set a "Connection: close" header on the response. This acts as a trigger to make Go's HTTP server automatically close the current connection after a response has been sent. + w.Header().Set("Connection", "close") + + // The value returned by recover() has the type any, so we use fmt.Errorf() to normalize it into an error and call our serverErrorResponse() helper. In turn, this will log the error using our custom Logger type at the ERROR level and send the client a 500 Internal Server Error response. + app.serverErrorResponse(w, r, fmt.Errorf("%s", err)) + } + }() + + next.ServeHTTP(w, r) + }) +} diff --git a/cmd/api/routes.go b/cmd/api/routes.go index 57904bc..a585357 100644 --- a/cmd/api/routes.go +++ b/cmd/api/routes.go @@ -26,5 +26,6 @@ func (app *application) routes() http.Handler { router.HandlerFunc(http.MethodGet, "/v1/movies/:id", app.showMovieHandler) // Return the httprouter instance. - return router + // Wrap the router with the panic recovery middleware + return app.recoverPanic(router) }