github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/pkg/panic_recovery/handler.go (about)

     1  package panicrecovery
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"runtime/debug"
     7  
     8  	"github.com/kyma-incubator/compass/components/director/pkg/apperrors"
     9  	"github.com/kyma-incubator/compass/components/director/pkg/log"
    10  )
    11  
    12  // NewPanicRecoveryMiddleware returns a standard mux middleware that provides panic recovery
    13  func NewPanicRecoveryMiddleware() func(http.Handler) http.Handler {
    14  	return func(handler http.Handler) http.Handler {
    15  		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    16  			defer func() {
    17  				if err := recover(); err != nil {
    18  					w.Header().Set("Content-Type", "application/json")
    19  					w.WriteHeader(http.StatusInternalServerError)
    20  
    21  					encoder := json.NewEncoder(w)
    22  					encoder.SetEscapeHTML(false)
    23  
    24  					if err := encoder.Encode(apperrors.NewInternalError("Unrecovered panic")); err != nil {
    25  						log.C(r.Context()).WithError(err).Errorf("Panic recovery failed: %s", err)
    26  					}
    27  					debug.PrintStack()
    28  					log.C(r.Context()).WithField("error", err).Errorf("Recovered panic: %s", err)
    29  				}
    30  			}()
    31  
    32  			handler.ServeHTTP(w, r)
    33  		})
    34  	}
    35  }