From 741676e8e028e24d6501dd811904236d8443f666 Mon Sep 17 00:00:00 2001 From: Gabor Javorszky Date: Fri, 3 Feb 2023 21:24:38 +0000 Subject: [PATCH] Add a custom error handler to gokit --- web/error/handler.go | 57 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 web/error/handler.go diff --git a/web/error/handler.go b/web/error/handler.go new file mode 100644 index 0000000..c71306c --- /dev/null +++ b/web/error/handler.go @@ -0,0 +1,57 @@ +package error + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/rs/zerolog" +) + +func Handler(logger zerolog.Logger) echo.HTTPErrorHandler { + ll := logger.With().Str("middleware", "errorHandler").Logger() + return func(err error, c echo.Context) { + if c.Response().Committed { + return + } + + ll.Err(err). + Str("requestID", c.Request().Header.Get(echo.HeaderXRequestID)). + Msg("request returned an error") + + he, ok := err.(*echo.HTTPError) + if ok { + if he.Internal != nil { + if herr, ok := he.Internal.(*echo.HTTPError); ok { + he = herr + } + } + } else { + he = &echo.HTTPError{ + Code: http.StatusInternalServerError, + Message: http.StatusText(http.StatusInternalServerError), + } + } + + // Issue #1426 + code := he.Code + message := he.Message + if m, ok := he.Message.(string); ok { + if c.Echo().Debug { + message = echo.Map{"code": code, "message": m, "error": err.Error()} + } else { + message = echo.Map{"code": code, "message": m} + } + } + + // Send response + if c.Request().Method == http.MethodHead { // Issue #608 + err = c.NoContent(he.Code) + } else { + err = c.JSON(code, message) + } + if err != nil { + + c.Logger().Error(err) + } + } +}