mirror of
https://github.com/rls-moe/nyx
synced 2024-11-14 22:12:24 +00:00
37 lines
944 B
Go
37 lines
944 B
Go
|
package middleware
|
||
|
|
||
|
// The original work was derived from Goji's middleware, source:
|
||
|
// https://github.com/zenazn/goji/tree/master/web/middleware
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"runtime/debug"
|
||
|
)
|
||
|
|
||
|
// Recoverer is a middleware that recovers from panics, logs the panic (and a
|
||
|
// backtrace), and returns a HTTP 500 (Internal Server Error) status if
|
||
|
// possible. Recoverer prints a request ID if one is provided.
|
||
|
//
|
||
|
// Alternatively, look at https://github.com/pressly/lg middleware pkgs.
|
||
|
func Recoverer(next http.Handler) http.Handler {
|
||
|
fn := func(w http.ResponseWriter, r *http.Request) {
|
||
|
defer func() {
|
||
|
if rvr := recover(); rvr != nil {
|
||
|
|
||
|
logEntry := GetLogEntry(r)
|
||
|
if logEntry != nil {
|
||
|
logEntry.Panic(rvr, debug.Stack())
|
||
|
} else {
|
||
|
debug.PrintStack()
|
||
|
}
|
||
|
|
||
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
next.ServeHTTP(w, r)
|
||
|
}
|
||
|
|
||
|
return http.HandlerFunc(fn)
|
||
|
}
|