Make modules/context.Context a context.Context (#16031)
* Make modules/context.Context a context.Context Signed-off-by: Andrew Thornton <art27@cantab.net> * Simplify context calls Signed-off-by: Andrew Thornton <art27@cantab.net> * Set the base context for requests to the HammerContext Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
518ed504ef
commit
3183a465d7
14 changed files with 46 additions and 23 deletions
|
@ -509,7 +509,7 @@ func (ctx *Context) ParamsInt64(p string) int64 {
|
||||||
|
|
||||||
// SetParams set params into routes
|
// SetParams set params into routes
|
||||||
func (ctx *Context) SetParams(k, v string) {
|
func (ctx *Context) SetParams(k, v string) {
|
||||||
chiCtx := chi.RouteContext(ctx.Req.Context())
|
chiCtx := chi.RouteContext(ctx)
|
||||||
chiCtx.URLParams.Add(strings.TrimPrefix(k, ":"), url.PathEscape(v))
|
chiCtx.URLParams.Add(strings.TrimPrefix(k, ":"), url.PathEscape(v))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,6 +528,26 @@ func (ctx *Context) Status(status int) {
|
||||||
ctx.Resp.WriteHeader(status)
|
ctx.Resp.WriteHeader(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deadline is part of the interface for context.Context and we pass this to the request context
|
||||||
|
func (ctx *Context) Deadline() (deadline time.Time, ok bool) {
|
||||||
|
return ctx.Req.Context().Deadline()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done is part of the interface for context.Context and we pass this to the request context
|
||||||
|
func (ctx *Context) Done() <-chan struct{} {
|
||||||
|
return ctx.Req.Context().Done()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Err is part of the interface for context.Context and we pass this to the request context
|
||||||
|
func (ctx *Context) Err() error {
|
||||||
|
return ctx.Req.Context().Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value is part of the interface for context.Context and we pass this to the request context
|
||||||
|
func (ctx *Context) Value(key interface{}) interface{} {
|
||||||
|
return ctx.Req.Context().Value(key)
|
||||||
|
}
|
||||||
|
|
||||||
// Handler represents a custom handler
|
// Handler represents a custom handler
|
||||||
type Handler func(*Context)
|
type Handler func(*Context)
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,9 @@
|
||||||
package graceful
|
package graceful
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -16,6 +18,7 @@ func newHTTPServer(network, address, name string, handler http.Handler) (*Server
|
||||||
WriteTimeout: DefaultWriteTimeOut,
|
WriteTimeout: DefaultWriteTimeOut,
|
||||||
MaxHeaderBytes: DefaultMaxHeaderBytes,
|
MaxHeaderBytes: DefaultMaxHeaderBytes,
|
||||||
Handler: handler,
|
Handler: handler,
|
||||||
|
BaseContext: func(net.Listener) context.Context { return GetManager().HammerContext() },
|
||||||
}
|
}
|
||||||
server.OnShutdown = func() {
|
server.OnShutdown = func() {
|
||||||
httpServer.SetKeepAlivesEnabled(false)
|
httpServer.SetKeepAlivesEnabled(false)
|
||||||
|
|
|
@ -113,7 +113,7 @@ func NewUserPost(ctx *context.Context) {
|
||||||
ctx.RenderWithErr(password.BuildComplexityError(ctx), tplUserNew, &form)
|
ctx.RenderWithErr(password.BuildComplexityError(ctx), tplUserNew, &form)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pwned, err := password.IsPwned(ctx.Req.Context(), form.Password)
|
pwned, err := password.IsPwned(ctx, form.Password)
|
||||||
if pwned {
|
if pwned {
|
||||||
ctx.Data["Err_Password"] = true
|
ctx.Data["Err_Password"] = true
|
||||||
errMsg := ctx.Tr("auth.password_pwned")
|
errMsg := ctx.Tr("auth.password_pwned")
|
||||||
|
@ -256,7 +256,7 @@ func EditUserPost(ctx *context.Context) {
|
||||||
ctx.RenderWithErr(password.BuildComplexityError(ctx), tplUserEdit, &form)
|
ctx.RenderWithErr(password.BuildComplexityError(ctx), tplUserEdit, &form)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pwned, err := password.IsPwned(ctx.Req.Context(), form.Password)
|
pwned, err := password.IsPwned(ctx, form.Password)
|
||||||
if pwned {
|
if pwned {
|
||||||
ctx.Data["Err_Password"] = true
|
ctx.Data["Err_Password"] = true
|
||||||
errMsg := ctx.Tr("auth.password_pwned")
|
errMsg := ctx.Tr("auth.password_pwned")
|
||||||
|
|
|
@ -88,7 +88,7 @@ func CreateUser(ctx *context.APIContext) {
|
||||||
ctx.Error(http.StatusBadRequest, "PasswordComplexity", err)
|
ctx.Error(http.StatusBadRequest, "PasswordComplexity", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pwned, err := password.IsPwned(ctx.Req.Context(), form.Password)
|
pwned, err := password.IsPwned(ctx, form.Password)
|
||||||
if pwned {
|
if pwned {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err.Error())
|
log.Error(err.Error())
|
||||||
|
@ -162,7 +162,7 @@ func EditUser(ctx *context.APIContext) {
|
||||||
ctx.Error(http.StatusBadRequest, "PasswordComplexity", err)
|
ctx.Error(http.StatusBadRequest, "PasswordComplexity", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pwned, err := password.IsPwned(ctx.Req.Context(), form.Password)
|
pwned, err := password.IsPwned(ctx, form.Password)
|
||||||
if pwned {
|
if pwned {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err.Error())
|
log.Error(err.Error())
|
||||||
|
|
|
@ -42,7 +42,7 @@ func Events(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen to connection close and un-register messageChan
|
// Listen to connection close and un-register messageChan
|
||||||
notify := ctx.Req.Context().Done()
|
notify := ctx.Done()
|
||||||
ctx.Resp.Flush()
|
ctx.Resp.Flush()
|
||||||
|
|
||||||
shutdownCtx := graceful.GetManager().ShutdownContext()
|
shutdownCtx := graceful.GetManager().ShutdownContext()
|
||||||
|
|
|
@ -400,7 +400,7 @@ func InstallPost(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Re-read settings
|
// Re-read settings
|
||||||
PostInstallInit(ctx.Req.Context())
|
PostInstallInit(ctx)
|
||||||
|
|
||||||
// Create admin account
|
// Create admin account
|
||||||
if len(form.AdminName) > 0 {
|
if len(form.AdminName) > 0 {
|
||||||
|
@ -454,7 +454,7 @@ func InstallPost(ctx *context.Context) {
|
||||||
|
|
||||||
// Now get the http.Server from this request and shut it down
|
// Now get the http.Server from this request and shut it down
|
||||||
// NB: This is not our hammerable graceful shutdown this is http.Server.Shutdown
|
// NB: This is not our hammerable graceful shutdown this is http.Server.Shutdown
|
||||||
srv := ctx.Req.Context().Value(http.ServerContextKey).(*http.Server)
|
srv := ctx.Value(http.ServerContextKey).(*http.Server)
|
||||||
go func() {
|
go func() {
|
||||||
if err := srv.Shutdown(graceful.GetManager().HammerContext()); err != nil {
|
if err := srv.Shutdown(graceful.GetManager().HammerContext()); err != nil {
|
||||||
log.Error("Unable to shutdown the install server! Error: %v", err)
|
log.Error("Unable to shutdown the install server! Error: %v", err)
|
||||||
|
|
|
@ -35,7 +35,7 @@ func FlushQueues(ctx *context.PrivateContext) {
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err := queue.GetManager().FlushAll(ctx.Req.Context(), opts.Timeout)
|
err := queue.GetManager().FlushAll(ctx, opts.Timeout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.JSON(http.StatusRequestTimeout, map[string]interface{}{
|
ctx.JSON(http.StatusRequestTimeout, map[string]interface{}{
|
||||||
"err": fmt.Sprintf("%v", err),
|
"err": fmt.Sprintf("%v", err),
|
||||||
|
|
|
@ -36,7 +36,7 @@ func RestoreRepo(ctx *myCtx.PrivateContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := migrations.RestoreRepository(
|
if err := migrations.RestoreRepository(
|
||||||
ctx.Req.Context(),
|
ctx,
|
||||||
params.RepoDir,
|
params.RepoDir,
|
||||||
params.OwnerName,
|
params.OwnerName,
|
||||||
params.RepoName,
|
params.RepoName,
|
||||||
|
|
|
@ -124,7 +124,7 @@ func RefBlame(ctx *context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
blameReader, err := git.CreateBlameReader(ctx.Req.Context(), models.RepoPath(userName, repoName), commitID, fileName)
|
blameReader, err := git.CreateBlameReader(ctx, models.RepoPath(userName, repoName), commitID, fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.NotFound("CreateBlameReader", err)
|
ctx.NotFound("CreateBlameReader", err)
|
||||||
return
|
return
|
||||||
|
|
|
@ -414,7 +414,7 @@ func LFSPointerFiles(ctx *context.Context) {
|
||||||
err = func() error {
|
err = func() error {
|
||||||
pointerChan := make(chan lfs.PointerBlob)
|
pointerChan := make(chan lfs.PointerBlob)
|
||||||
errChan := make(chan error, 1)
|
errChan := make(chan error, 1)
|
||||||
go lfs.SearchPointerBlobs(ctx.Req.Context(), ctx.Repo.GitRepo, pointerChan, errChan)
|
go lfs.SearchPointerBlobs(ctx, ctx.Repo.GitRepo, pointerChan, errChan)
|
||||||
|
|
||||||
numPointers := 0
|
numPointers := 0
|
||||||
var numAssociated, numNoExist, numAssociatable int
|
var numAssociated, numNoExist, numAssociatable int
|
||||||
|
|
|
@ -1011,9 +1011,9 @@ func LinkAccountPostRegister(ctx *context.Context) {
|
||||||
case setting.ImageCaptcha:
|
case setting.ImageCaptcha:
|
||||||
valid = context.GetImageCaptcha().VerifyReq(ctx.Req)
|
valid = context.GetImageCaptcha().VerifyReq(ctx.Req)
|
||||||
case setting.ReCaptcha:
|
case setting.ReCaptcha:
|
||||||
valid, err = recaptcha.Verify(ctx.Req.Context(), form.GRecaptchaResponse)
|
valid, err = recaptcha.Verify(ctx, form.GRecaptchaResponse)
|
||||||
case setting.HCaptcha:
|
case setting.HCaptcha:
|
||||||
valid, err = hcaptcha.Verify(ctx.Req.Context(), form.HcaptchaResponse)
|
valid, err = hcaptcha.Verify(ctx, form.HcaptchaResponse)
|
||||||
default:
|
default:
|
||||||
ctx.ServerError("Unknown Captcha Type", fmt.Errorf("Unknown Captcha Type: %s", setting.Service.CaptchaType))
|
ctx.ServerError("Unknown Captcha Type", fmt.Errorf("Unknown Captcha Type: %s", setting.Service.CaptchaType))
|
||||||
return
|
return
|
||||||
|
@ -1153,9 +1153,9 @@ func SignUpPost(ctx *context.Context) {
|
||||||
case setting.ImageCaptcha:
|
case setting.ImageCaptcha:
|
||||||
valid = context.GetImageCaptcha().VerifyReq(ctx.Req)
|
valid = context.GetImageCaptcha().VerifyReq(ctx.Req)
|
||||||
case setting.ReCaptcha:
|
case setting.ReCaptcha:
|
||||||
valid, err = recaptcha.Verify(ctx.Req.Context(), form.GRecaptchaResponse)
|
valid, err = recaptcha.Verify(ctx, form.GRecaptchaResponse)
|
||||||
case setting.HCaptcha:
|
case setting.HCaptcha:
|
||||||
valid, err = hcaptcha.Verify(ctx.Req.Context(), form.HcaptchaResponse)
|
valid, err = hcaptcha.Verify(ctx, form.HcaptchaResponse)
|
||||||
default:
|
default:
|
||||||
ctx.ServerError("Unknown Captcha Type", fmt.Errorf("Unknown Captcha Type: %s", setting.Service.CaptchaType))
|
ctx.ServerError("Unknown Captcha Type", fmt.Errorf("Unknown Captcha Type: %s", setting.Service.CaptchaType))
|
||||||
return
|
return
|
||||||
|
@ -1191,7 +1191,7 @@ func SignUpPost(ctx *context.Context) {
|
||||||
ctx.RenderWithErr(password.BuildComplexityError(ctx), tplSignUp, &form)
|
ctx.RenderWithErr(password.BuildComplexityError(ctx), tplSignUp, &form)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pwned, err := password.IsPwned(ctx.Req.Context(), form.Password)
|
pwned, err := password.IsPwned(ctx, form.Password)
|
||||||
if pwned {
|
if pwned {
|
||||||
errMsg := ctx.Tr("auth.password_pwned")
|
errMsg := ctx.Tr("auth.password_pwned")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1620,7 +1620,7 @@ func ResetPasswdPost(ctx *context.Context) {
|
||||||
ctx.Data["Err_Password"] = true
|
ctx.Data["Err_Password"] = true
|
||||||
ctx.RenderWithErr(password.BuildComplexityError(ctx), tplResetPassword, nil)
|
ctx.RenderWithErr(password.BuildComplexityError(ctx), tplResetPassword, nil)
|
||||||
return
|
return
|
||||||
} else if pwned, err := password.IsPwned(ctx.Req.Context(), passwd); pwned || err != nil {
|
} else if pwned, err := password.IsPwned(ctx, passwd); pwned || err != nil {
|
||||||
errMsg := ctx.Tr("auth.password_pwned")
|
errMsg := ctx.Tr("auth.password_pwned")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err.Error())
|
log.Error(err.Error())
|
||||||
|
|
|
@ -385,13 +385,13 @@ func RegisterOpenIDPost(ctx *context.Context) {
|
||||||
ctx.ServerError("", err)
|
ctx.ServerError("", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
valid, err = recaptcha.Verify(ctx.Req.Context(), form.GRecaptchaResponse)
|
valid, err = recaptcha.Verify(ctx, form.GRecaptchaResponse)
|
||||||
case setting.HCaptcha:
|
case setting.HCaptcha:
|
||||||
if err := ctx.Req.ParseForm(); err != nil {
|
if err := ctx.Req.ParseForm(); err != nil {
|
||||||
ctx.ServerError("", err)
|
ctx.ServerError("", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
valid, err = hcaptcha.Verify(ctx.Req.Context(), form.HcaptchaResponse)
|
valid, err = hcaptcha.Verify(ctx, form.HcaptchaResponse)
|
||||||
default:
|
default:
|
||||||
ctx.ServerError("Unknown Captcha Type", fmt.Errorf("Unknown Captcha Type: %s", setting.Service.CaptchaType))
|
ctx.ServerError("Unknown Captcha Type", fmt.Errorf("Unknown Captcha Type: %s", setting.Service.CaptchaType))
|
||||||
return
|
return
|
||||||
|
|
|
@ -58,7 +58,7 @@ func AccountPost(ctx *context.Context) {
|
||||||
ctx.Flash.Error(ctx.Tr("form.password_not_match"))
|
ctx.Flash.Error(ctx.Tr("form.password_not_match"))
|
||||||
} else if !password.IsComplexEnough(form.Password) {
|
} else if !password.IsComplexEnough(form.Password) {
|
||||||
ctx.Flash.Error(password.BuildComplexityError(ctx))
|
ctx.Flash.Error(password.BuildComplexityError(ctx))
|
||||||
} else if pwned, err := password.IsPwned(ctx.Req.Context(), form.Password); pwned || err != nil {
|
} else if pwned, err := password.IsPwned(ctx, form.Password); pwned || err != nil {
|
||||||
errMsg := ctx.Tr("auth.password_pwned")
|
errMsg := ctx.Tr("auth.password_pwned")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err.Error())
|
log.Error(err.Error())
|
||||||
|
|
|
@ -76,7 +76,7 @@ func (aReq *ArchiveRequest) IsComplete() bool {
|
||||||
func (aReq *ArchiveRequest) WaitForCompletion(ctx *context.Context) bool {
|
func (aReq *ArchiveRequest) WaitForCompletion(ctx *context.Context) bool {
|
||||||
select {
|
select {
|
||||||
case <-aReq.cchan:
|
case <-aReq.cchan:
|
||||||
case <-ctx.Req.Context().Done():
|
case <-ctx.Done():
|
||||||
}
|
}
|
||||||
|
|
||||||
return aReq.IsComplete()
|
return aReq.IsComplete()
|
||||||
|
@ -92,7 +92,7 @@ func (aReq *ArchiveRequest) TimedWaitForCompletion(ctx *context.Context, dur tim
|
||||||
case <-time.After(dur):
|
case <-time.After(dur):
|
||||||
timeout = true
|
timeout = true
|
||||||
case <-aReq.cchan:
|
case <-aReq.cchan:
|
||||||
case <-ctx.Req.Context().Done():
|
case <-ctx.Done():
|
||||||
}
|
}
|
||||||
|
|
||||||
return aReq.IsComplete(), timeout
|
return aReq.IsComplete(), timeout
|
||||||
|
|
Reference in a new issue