mirror of
https://github.com/go-gitea/gitea.git
synced 2026-07-22 14:25:18 +02:00
1. use var names "reqOwnerName, reqRepoName", because these values are from request and should not be really used for path construction 2. simplify enable-pprof logic, don't "log.Fatal" 3. don't make runServe command to guess the repo storage path, instead, let server return RepoStoragePath 4. don't process lfs verbs when the repo is a wiki 5. construct the request URI path correctly for the lfs transfer backend (moved to the caller) 6. don't call "owner, err := user_model.GetUserByName", the "owner rename redirection" has been done before 7. fix incorrect "repo.OwnerName = ownerName", the real owner might have been "redirected" 8. fix incorrect "inactive owner" check, it should be checked even if the repo is redirected Use general error functions to handle responses, error handling code is hugely simplified.
100 lines
3.0 KiB
Go
100 lines
3.0 KiB
Go
// Copyright 2020 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package context
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"gitea.dev/modules/graceful"
|
|
"gitea.dev/modules/log"
|
|
"gitea.dev/modules/private"
|
|
"gitea.dev/modules/process"
|
|
"gitea.dev/modules/web"
|
|
web_types "gitea.dev/modules/web/types"
|
|
)
|
|
|
|
// PrivateContext represents a context for private routes
|
|
type PrivateContext struct {
|
|
*Base
|
|
Override context.Context
|
|
|
|
Repo *Repository
|
|
}
|
|
|
|
func init() {
|
|
web.RegisterResponseStatusProvider[*PrivateContext](func(req *http.Request) web_types.ResponseStatusProvider {
|
|
return req.Context().Value(privateContextKey).(*PrivateContext)
|
|
})
|
|
}
|
|
|
|
func (ctx *PrivateContext) Deadline() (deadline time.Time, ok bool) {
|
|
if ctx.Override != nil {
|
|
return ctx.Override.Deadline()
|
|
}
|
|
return ctx.Base.Deadline()
|
|
}
|
|
|
|
func (ctx *PrivateContext) Done() <-chan struct{} {
|
|
if ctx.Override != nil {
|
|
return ctx.Override.Done()
|
|
}
|
|
return ctx.Base.Done()
|
|
}
|
|
|
|
func (ctx *PrivateContext) Err() error {
|
|
if ctx.Override != nil {
|
|
return ctx.Override.Err()
|
|
}
|
|
return ctx.Base.Err()
|
|
}
|
|
|
|
func (ctx *PrivateContext) PrivateInternalErrorf(format string, args ...any) {
|
|
s := fmt.Sprintf(format, args...)
|
|
log.ErrorWithSkip(1, "Internal error: %s", s)
|
|
ctx.JSON(http.StatusInternalServerError, private.Response{Err: s})
|
|
}
|
|
|
|
func (ctx *PrivateContext) PrivateUserErrorf(status int, format string, args ...any) {
|
|
ctx.JSON(status, private.Response{UserMsg: fmt.Sprintf(format, args...)})
|
|
}
|
|
|
|
type privateContextKeyType struct{}
|
|
|
|
var privateContextKey privateContextKeyType
|
|
|
|
func GetPrivateContext(req *http.Request) *PrivateContext {
|
|
return req.Context().Value(privateContextKey).(*PrivateContext)
|
|
}
|
|
|
|
func PrivateContexter() func(http.Handler) http.Handler {
|
|
return func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
|
base := NewBaseContext(w, req)
|
|
ctx := &PrivateContext{Base: base}
|
|
ctx.SetContextValue(privateContextKey, ctx)
|
|
next.ServeHTTP(ctx.Resp, ctx.Req)
|
|
})
|
|
}
|
|
}
|
|
|
|
// OverrideContext overrides the underlying request context for Done() etc.
|
|
// This function should be used when there is a need for work to continue even if the request has been cancelled.
|
|
// Primarily this affects hook/post-receive and hook/proc-receive both of which need to continue working even if
|
|
// the underlying request has timed out from the ssh/http push
|
|
func OverrideContext() func(http.Handler) http.Handler {
|
|
return func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
|
// We now need to override the request context as the base for our work because even if the request is cancelled we have to continue this work
|
|
ctx := GetPrivateContext(req)
|
|
var finished func()
|
|
ctx.Override, _, finished = process.GetManager().AddTypedContext(graceful.GetManager().HammerContext(), "PrivateContext: "+ctx.Req.RequestURI, process.RequestProcessType, true)
|
|
defer finished()
|
|
next.ServeHTTP(ctx.Resp, ctx.Req)
|
|
})
|
|
}
|
|
}
|