From a04066148ff2412ad5bcaf6f9f80697f56924ea8 Mon Sep 17 00:00:00 2001 From: Nikita Tokarchuk Date: Fri, 3 Dec 2021 03:04:27 +0100 Subject: [PATCH] Implement any-error handler --- frontend/renderer/error.go | 40 +++++++++++++++++++++++++++++++++++ frontend/renderer/renderer.go | 1 + 2 files changed, 41 insertions(+) diff --git a/frontend/renderer/error.go b/frontend/renderer/error.go index 9e7a183..651b57a 100644 --- a/frontend/renderer/error.go +++ b/frontend/renderer/error.go @@ -1,8 +1,12 @@ package renderer import ( + "fmt" + "net/http" + "code.tokarch.uk/mainnika/nikita-tokarch-uk/frontend/content" routing "github.com/jackwhelpton/fasthttp-routing/v2" + "github.com/sirupsen/logrus" ) // errorNotFound renders http error-404 template @@ -12,3 +16,39 @@ func (r *Renderer) errorNotFound(c *routing.Context) (err error) { return c.Write(errorContent) } + +// useErrorHandler is the middleware that catch handlers errors and render error template +func (r *Renderer) useErrorHandler(c *routing.Context) (err error) { + + worker := func() (err error) { + + defer func() { + r := recover() + if r == nil { + return + } + + err = routing.NewHTTPError(http.StatusInternalServerError, + fmt.Sprintf("panic:\n%v", r)) + }() + + err = c.Next() + + return + } + + err = worker() + if err == nil { + return + } + + c.Abort() + + logrus.Warnf("Cannot process request, %v", err) + + errorContent := content.Error{ + Message: err.Error(), + } + + return c.Write(errorContent) +} diff --git a/frontend/renderer/renderer.go b/frontend/renderer/renderer.go index 79313d5..07d711d 100644 --- a/frontend/renderer/renderer.go +++ b/frontend/renderer/renderer.go @@ -29,6 +29,7 @@ func (r *Renderer) init() { router := routing.New() router.Use(r.useTemplateWriter) + router.Use(r.useErrorHandler) router.NotFound(r.errorNotFound) r.router = router