aboutsummaryrefslogtreecommitdiff
path: root/echo/middleware/recover_middleware.go
diff options
context:
space:
mode:
Diffstat (limited to 'echo/middleware/recover_middleware.go')
-rw-r--r--echo/middleware/recover_middleware.go27
1 files changed, 25 insertions, 2 deletions
diff --git a/echo/middleware/recover_middleware.go b/echo/middleware/recover_middleware.go
index 310e146..af4259a 100644
--- a/echo/middleware/recover_middleware.go
+++ b/echo/middleware/recover_middleware.go
@@ -1,9 +1,11 @@
1package middleware 1package middleware
2 2
3import ( 3import (
4 "bytes"
4 "fmt" 5 "fmt"
5 "net/http" 6 "net/http"
6 "runtime" 7 "runtime"
8 "text/template"
7 9
8 "github.com/labstack/echo/v4" 10 "github.com/labstack/echo/v4"
9 "github.com/labstack/echo/v4/middleware" 11 "github.com/labstack/echo/v4/middleware"
@@ -49,6 +51,16 @@ var (
49 DisablePrintStack: false, 51 DisablePrintStack: false,
50 LogLevel: 0, 52 LogLevel: 0,
51 } 53 }
54 defaultErrorTemplate = `<html>
55 <head>
56 <title>Error</title>
57 <style type="text/css">
58 pre { border: 1px solid black; padding: 1em; background: #f0f0f0; font-size: 1.5em; }
59 </style>
60 </head>
61 <body><h1>Error</h1><pre>{{ . }}</pre></body>
62 </html>
63 `
52) 64)
53 65
54// Recover returns a middleware which recovers from panics anywhere in the chain 66// Recover returns a middleware which recovers from panics anywhere in the chain
@@ -68,6 +80,11 @@ func RecoverWithConfig(config RecoverConfig) echo.MiddlewareFunc {
68 config.StackSize = DefaultRecoverConfig.StackSize 80 config.StackSize = DefaultRecoverConfig.StackSize
69 } 81 }
70 82
83 errorTemplate, err := template.New("").Parse(defaultErrorTemplate)
84 if err != nil {
85 panic("RecoverWithConfig: error parsing html template")
86 }
87
71 return func(next echo.HandlerFunc) echo.HandlerFunc { 88 return func(next echo.HandlerFunc) echo.HandlerFunc {
72 return func(c echo.Context) error { 89 return func(c echo.Context) error {
73 if config.Skipper(c) { 90 if config.Skipper(c) {
@@ -100,8 +117,14 @@ func RecoverWithConfig(config RecoverConfig) echo.MiddlewareFunc {
100 } 117 }
101 } 118 }
102 if c.Echo().Debug { 119 if c.Echo().Debug {
103 msg := fmt.Sprintf("%v %s\n", err, stack[:length]) 120 buf := bytes.Buffer{}
104 c.String(http.StatusInternalServerError, msg) 121 msg := fmt.Sprintf("%v\n\n%s", err, stack[:length])
122 if err := errorTemplate.Execute(&buf, msg); err != nil {
123 c.Logger().Errorf("Error rendering HTML error page: %s", err)
124 c.String(http.StatusInternalServerError, msg)
125 return
126 }
127 c.HTMLBlob(http.StatusInternalServerError, buf.Bytes())
105 } else { 128 } else {
106 c.Error(err) 129 c.Error(err)
107 } 130 }