Recover returns middleware that recovers from panics.
()
| 30 | |
| 31 | // Recover returns middleware that recovers from panics. |
| 32 | func Recover() MiddlewareFunc { |
| 33 | return func(next http.Handler) http.Handler { |
| 34 | return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 35 | defer func() { |
| 36 | if p := recover(); p != nil { |
| 37 | fmt.Fprintln(os.Stderr, p) |
| 38 | os.Stderr.Write(debug.Stack()) |
| 39 | var err error |
| 40 | if pErr, ok := p.(error); ok { |
| 41 | err = errHTTPRecovered.WithCause(pErr) |
| 42 | } else { |
| 43 | err = errHTTPRecovered.WithAttributes("panic", p) |
| 44 | } |
| 45 | log.FromContext(r.Context()).WithError(err).Error("Handler panicked") |
| 46 | webhandlers.Error(w, r, err) |
| 47 | } |
| 48 | }() |
| 49 | next.ServeHTTP(w, r) |
| 50 | }) |
| 51 | } |
| 52 | } |