mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
//nolint:unused,deadcode
 | 
						|
package response
 | 
						|
 | 
						|
//NOTE: This file belongs into pkg/web, but due to cyclic imports that are hard to resolve at the current time, it temporarily lives here.
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
 | 
						|
	"github.com/grafana/grafana/pkg/services/contexthandler/ctxkey"
 | 
						|
	contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
 | 
						|
	"github.com/grafana/grafana/pkg/web"
 | 
						|
)
 | 
						|
 | 
						|
type (
 | 
						|
	handlerStd       = func(http.ResponseWriter, *http.Request)
 | 
						|
	handlerStdCtx    = func(http.ResponseWriter, *http.Request, *web.Context)
 | 
						|
	handlerStdReqCtx = func(http.ResponseWriter, *http.Request, *contextmodel.ReqContext)
 | 
						|
	handlerReqCtx    = func(*contextmodel.ReqContext)
 | 
						|
	handlerReqCtxRes = func(*contextmodel.ReqContext) Response
 | 
						|
	handlerCtx       = func(*web.Context)
 | 
						|
)
 | 
						|
 | 
						|
func wrap_handler(h web.Handler) http.HandlerFunc {
 | 
						|
	switch handle := h.(type) {
 | 
						|
	case http.HandlerFunc:
 | 
						|
		return handle
 | 
						|
	case handlerStd:
 | 
						|
		return handle
 | 
						|
	case handlerStdCtx:
 | 
						|
		return func(w http.ResponseWriter, r *http.Request) {
 | 
						|
			handle(w, r, webCtx(w, r))
 | 
						|
		}
 | 
						|
	case handlerStdReqCtx:
 | 
						|
		return func(w http.ResponseWriter, r *http.Request) {
 | 
						|
			handle(w, r, reqCtx(w, r))
 | 
						|
		}
 | 
						|
	case handlerReqCtx:
 | 
						|
		return func(w http.ResponseWriter, r *http.Request) {
 | 
						|
			handle(reqCtx(w, r))
 | 
						|
		}
 | 
						|
	case handlerReqCtxRes:
 | 
						|
		return func(w http.ResponseWriter, r *http.Request) {
 | 
						|
			ctx := reqCtx(w, r)
 | 
						|
			res := handle(ctx)
 | 
						|
			if res != nil {
 | 
						|
				res.WriteTo(ctx)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	case handlerCtx:
 | 
						|
		return func(w http.ResponseWriter, r *http.Request) {
 | 
						|
			handle(webCtx(w, r))
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	panic(fmt.Sprintf("unexpected handler type: %T", h))
 | 
						|
}
 | 
						|
 | 
						|
func webCtx(w http.ResponseWriter, r *http.Request) *web.Context {
 | 
						|
	ctx := web.FromContext(r.Context())
 | 
						|
	if ctx == nil {
 | 
						|
		panic("no *web.Context found")
 | 
						|
	}
 | 
						|
 | 
						|
	ctx.Req = r
 | 
						|
	ctx.Resp = web.Rw(w, r)
 | 
						|
	return ctx
 | 
						|
}
 | 
						|
 | 
						|
func reqCtx(w http.ResponseWriter, r *http.Request) *contextmodel.ReqContext {
 | 
						|
	wCtx := webCtx(w, r)
 | 
						|
	reqCtx, ok := wCtx.Req.Context().Value(ctxkey.Key{}).(*contextmodel.ReqContext)
 | 
						|
	if !ok {
 | 
						|
		panic("no *contextmodel.ReqContext found")
 | 
						|
	}
 | 
						|
	return reqCtx
 | 
						|
}
 |