mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01:00 
			
		
		
		
	@@ -121,7 +121,7 @@ func wrapHandlerProvider[T http.Handler](hp func(next http.Handler) T, funcInfo
 | 
			
		||||
	return func(next http.Handler) http.Handler {
 | 
			
		||||
		h := hp(next) // this handle could be dynamically generated, so we can't use it for debug info
 | 
			
		||||
		return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
 | 
			
		||||
			routing.UpdateFuncInfo(req.Context(), funcInfo)
 | 
			
		||||
			defer routing.RecordFuncInfo(req.Context(), funcInfo)()
 | 
			
		||||
			h.ServeHTTP(resp, req)
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
@@ -157,7 +157,7 @@ func toHandlerProvider(handler any) func(next http.Handler) http.Handler {
 | 
			
		||||
				return // it's doing pre-check, just return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			routing.UpdateFuncInfo(req.Context(), funcInfo)
 | 
			
		||||
			defer routing.RecordFuncInfo(req.Context(), funcInfo)()
 | 
			
		||||
			ret := fn.Call(argsIn)
 | 
			
		||||
 | 
			
		||||
			// handle the return value (no-op at the moment)
 | 
			
		||||
 
 | 
			
		||||
@@ -12,16 +12,18 @@ type contextKeyType struct{}
 | 
			
		||||
 | 
			
		||||
var contextKey contextKeyType
 | 
			
		||||
 | 
			
		||||
// UpdateFuncInfo updates a context's func info
 | 
			
		||||
func UpdateFuncInfo(ctx context.Context, funcInfo *FuncInfo) {
 | 
			
		||||
	record, ok := ctx.Value(contextKey).(*requestRecord)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
// RecordFuncInfo records a func info into context
 | 
			
		||||
func RecordFuncInfo(ctx context.Context, funcInfo *FuncInfo) (end func()) {
 | 
			
		||||
	// TODO: reqCtx := reqctx.FromContext(ctx), add trace support
 | 
			
		||||
	end = func() {}
 | 
			
		||||
 | 
			
		||||
	// save the func info into the context record
 | 
			
		||||
	if record, ok := ctx.Value(contextKey).(*requestRecord); ok {
 | 
			
		||||
		record.lock.Lock()
 | 
			
		||||
		record.funcInfo = funcInfo
 | 
			
		||||
		record.lock.Unlock()
 | 
			
		||||
	}
 | 
			
		||||
	return end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarkLongPolling marks the request is a long-polling request, and the logger may output different message for it
 | 
			
		||||
 
 | 
			
		||||
@@ -213,7 +213,7 @@ func NormalRoutes() *web.Router {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	r.NotFound(func(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
		routing.UpdateFuncInfo(req.Context(), routing.GetFuncInfo(http.NotFound, "GlobalNotFound"))
 | 
			
		||||
		defer routing.RecordFuncInfo(req.Context(), routing.GetFuncInfo(http.NotFound, "GlobalNotFound"))()
 | 
			
		||||
		http.NotFound(w, req)
 | 
			
		||||
	})
 | 
			
		||||
	return r
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ func storageHandler(storageSetting *setting.Storage, prefix string, objStore sto
 | 
			
		||||
				http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			routing.UpdateFuncInfo(req.Context(), funcInfo)
 | 
			
		||||
			defer routing.RecordFuncInfo(req.Context(), funcInfo)()
 | 
			
		||||
 | 
			
		||||
			rPath := strings.TrimPrefix(req.URL.Path, "/"+prefix+"/")
 | 
			
		||||
			rPath = util.PathJoinRelX(rPath)
 | 
			
		||||
@@ -65,7 +65,7 @@ func storageHandler(storageSetting *setting.Storage, prefix string, objStore sto
 | 
			
		||||
			http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		routing.UpdateFuncInfo(req.Context(), funcInfo)
 | 
			
		||||
		defer routing.RecordFuncInfo(req.Context(), funcInfo)()
 | 
			
		||||
 | 
			
		||||
		rPath := strings.TrimPrefix(req.URL.Path, "/"+prefix+"/")
 | 
			
		||||
		rPath = util.PathJoinRelX(rPath)
 | 
			
		||||
 
 | 
			
		||||
@@ -1622,7 +1622,7 @@ func registerRoutes(m *web.Router) {
 | 
			
		||||
 | 
			
		||||
	m.NotFound(func(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
		ctx := context.GetWebContext(req)
 | 
			
		||||
		routing.UpdateFuncInfo(ctx, routing.GetFuncInfo(ctx.NotFound, "WebNotFound"))
 | 
			
		||||
		defer routing.RecordFuncInfo(ctx, routing.GetFuncInfo(ctx.NotFound, "WebNotFound"))()
 | 
			
		||||
		ctx.NotFound("", nil)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@
 | 
			
		||||
package context
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"html/template"
 | 
			
		||||
	"io"
 | 
			
		||||
@@ -25,8 +24,7 @@ type BaseContextKeyType struct{}
 | 
			
		||||
var BaseContextKey BaseContextKeyType
 | 
			
		||||
 | 
			
		||||
type Base struct {
 | 
			
		||||
	context.Context
 | 
			
		||||
	reqctx.RequestDataStore
 | 
			
		||||
	reqctx.RequestContext
 | 
			
		||||
 | 
			
		||||
	Resp ResponseWriter
 | 
			
		||||
	Req  *http.Request
 | 
			
		||||
@@ -172,19 +170,19 @@ func (b *Base) TrN(cnt any, key1, keyN string, args ...any) template.HTML {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewBaseContext(resp http.ResponseWriter, req *http.Request) *Base {
 | 
			
		||||
	ds := reqctx.GetRequestDataStore(req.Context())
 | 
			
		||||
	reqCtx := reqctx.FromContext(req.Context())
 | 
			
		||||
	b := &Base{
 | 
			
		||||
		Context:          req.Context(),
 | 
			
		||||
		RequestDataStore: ds,
 | 
			
		||||
		RequestContext: reqCtx,
 | 
			
		||||
 | 
			
		||||
		Req:    req,
 | 
			
		||||
		Resp:   WrapResponseWriter(resp),
 | 
			
		||||
		Locale: middleware.Locale(resp, req),
 | 
			
		||||
		Data:             ds.GetData(),
 | 
			
		||||
		Data:   reqCtx.GetData(),
 | 
			
		||||
	}
 | 
			
		||||
	b.Req = b.Req.WithContext(b)
 | 
			
		||||
	ds.SetContextValue(BaseContextKey, b)
 | 
			
		||||
	ds.SetContextValue(translation.ContextKey, b.Locale)
 | 
			
		||||
	ds.SetContextValue(httplib.RequestContextKey, b.Req)
 | 
			
		||||
	reqCtx.SetContextValue(BaseContextKey, b)
 | 
			
		||||
	reqCtx.SetContextValue(translation.ContextKey, b.Locale)
 | 
			
		||||
	reqCtx.SetContextValue(httplib.RequestContextKey, b.Req)
 | 
			
		||||
	return b
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user