diff options
Diffstat (limited to 'echo/middleware/recover_middleware.go')
-rw-r--r-- | echo/middleware/recover_middleware.go | 27 |
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 @@ | |||
1 | package middleware | 1 | package middleware |
2 | 2 | ||
3 | import ( | 3 | import ( |
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 | } |