package ginext import ( "fmt" "git.blackforestbytes.com/BlackForestBytes/goext/exerr" "github.com/gin-gonic/gin" "net/http" ) type WHandlerFunc func(PreContext) HTTPResponse func Wrap(w *GinWrapper, fn WHandlerFunc) gin.HandlerFunc { return func(g *gin.Context) { reqctx := g.Request.Context() pctx := PreContext{ wrapper: w, ginCtx: g, persistantData: &preContextData{}, } for _, lstr := range w.listenerBeforeRequest { lstr(g) } wrap, stackTrace, panicObj := callPanicSafe(fn, pctx) if panicObj != nil { fmt.Printf("\n======== ======== STACKTRACE ======== ========\n%s\n======== ======== ======== ========\n\n", stackTrace) err := exerr. New(exerr.TypePanic, "Panic occured (in gin handler)"). Any("panicObj", panicObj). Str("trace", stackTrace). Build() wrap = Error(err) } if g.Writer.Written() { panic("Writing in WrapperFunc is not supported") } if pctx.persistantData.sessionObj != nil { err := pctx.persistantData.sessionObj.Finish(reqctx, wrap) if err != nil { wrap = Error(exerr.Wrap(err, "Failed to finish session").Any("originalResponse", wrap).Build()) } } for _, lstr := range w.listenerAfterRequest { lstr(g, wrap) } if reqctx.Err() == nil { wrap.Write(g) } } } func WrapHTTPHandler(w *GinWrapper, fn http.Handler) gin.HandlerFunc { return func(g *gin.Context) { for _, lstr := range w.listenerBeforeRequest { lstr(g) } fn.ServeHTTP(g.Writer, g.Request) for _, lstr := range w.listenerAfterRequest { lstr(g, nil) } } } func WrapHTTPHandlerFunc(w *GinWrapper, fn http.HandlerFunc) gin.HandlerFunc { return func(g *gin.Context) { for _, lstr := range w.listenerBeforeRequest { lstr(g) } fn(g.Writer, g.Request) for _, lstr := range w.listenerAfterRequest { lstr(g, nil) } } }