41 lines
821 B
Go
41 lines
821 B
Go
package router
|
|
|
|
import (
|
|
"net/http"
|
|
"runtime/debug"
|
|
"time"
|
|
)
|
|
|
|
func NewRecoveryMiddleware(print func(string, ...any)) func(Handler) Handler {
|
|
mw := func(next Handler) Handler {
|
|
return newRecoveryHandler(next, print)
|
|
}
|
|
return mw
|
|
}
|
|
|
|
type recoveryHandler struct {
|
|
next Handler
|
|
print func(string, ...any)
|
|
}
|
|
|
|
func newRecoveryHandler(next Handler, print func(string, ...any)) *recoveryHandler {
|
|
return &recoveryHandler{
|
|
next: next,
|
|
print: print,
|
|
}
|
|
}
|
|
|
|
func (hand recoveryHandler) ServeHTTP(ctx *Context) {
|
|
exitFunc := func() {
|
|
err := recover()
|
|
if err != nil {
|
|
ctx.Writer.WriteHeader(http.StatusInternalServerError)
|
|
stack := string(debug.Stack())
|
|
timestamp := time.Now().Format(time.RFC3339)
|
|
hand.print("%s %v ; %s\n", timestamp, err, stack)
|
|
}
|
|
}
|
|
defer exitFunc()
|
|
hand.next.ServeHTTP(ctx)
|
|
}
|