package web import ( "encoding/json" "net/http" sentryhttp "github.com/getsentry/sentry-go/http" log "github.com/sirupsen/logrus" ) func recoveryMiddleware() func(next http.Handler) http.Handler { sentryHandler := sentryhttp.New(sentryhttp.Options{}) l := log.WithField("logger", "authentik.sentry") return func(next http.Handler) http.Handler { sentryHandler.Handle(next) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { next.ServeHTTP(w, r) defer func() { re := recover() if re == nil { return } err := re.(error) if err != nil { l.WithError(err).Warning("global panic handler") jsonBody, _ := json.Marshal(struct { Successful bool Error string }{ Successful: false, Error: err.Error(), }) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusInternalServerError) _, err := w.Write(jsonBody) if err != nil { l.WithError(err).Warning("Failed to write sentry error body") } } }() }) } }