forked from forgejo/forgejo
Update go-chi/session (fixes "race" in tests) (#17031)
Update to latest go-chi/session where the NewManager causes a new Provider instantiation instead of reconfiguring an old one. (https://gitea.com/go-chi/session/pulls/1) The NewManager call is now concurrency safe and would allow live reconfiguration in future but for now this PR simply fixes an intermittent "data-race" detected in our tests. (See https://drone.gitea.io/go-gitea/gitea/43900/2/14) Related #17027 Related #1441 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
parent
132c8c43e1
commit
8af7a21085
4 changed files with 30 additions and 9 deletions
31
vendor/gitea.com/go-chi/session/session.go
generated
vendored
31
vendor/gitea.com/go-chi/session/session.go
generated
vendored
|
@ -23,6 +23,7 @@ import (
|
|||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"reflect"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
@ -291,17 +292,34 @@ type Provider interface {
|
|||
GC()
|
||||
}
|
||||
|
||||
var providers = make(map[string]Provider)
|
||||
var providers = make(map[string]func() Provider)
|
||||
|
||||
// Register registers a provider.
|
||||
func Register(name string, provider Provider) {
|
||||
if provider == nil {
|
||||
if reflect.TypeOf(provider).Kind() == reflect.Ptr {
|
||||
// Pointer:
|
||||
RegisterFn(name, func() Provider {
|
||||
return reflect.New(reflect.ValueOf(provider).Elem().Type()).Interface().(Provider)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// Not a Pointer
|
||||
RegisterFn(name, func() Provider {
|
||||
return reflect.New(reflect.TypeOf(provider)).Elem().Interface().(Provider)
|
||||
})
|
||||
}
|
||||
|
||||
// RegisterFn registers a provider function.
|
||||
func RegisterFn(name string, providerfn func() Provider) {
|
||||
if providerfn == nil {
|
||||
panic("session: cannot register provider with nil value")
|
||||
}
|
||||
if _, dup := providers[name]; dup {
|
||||
panic(fmt.Errorf("session: cannot register provider '%s' twice", name))
|
||||
}
|
||||
providers[name] = provider
|
||||
|
||||
providers[name] = providerfn
|
||||
}
|
||||
|
||||
// _____
|
||||
|
@ -318,12 +336,15 @@ type Manager struct {
|
|||
}
|
||||
|
||||
// NewManager creates and returns a new session manager by given provider name and configuration.
|
||||
// It panics when given provider isn't registered.
|
||||
// It returns an error when requested provider name isn't registered.
|
||||
func NewManager(name string, opt Options) (*Manager, error) {
|
||||
p, ok := providers[name]
|
||||
fn, ok := providers[name]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("session: unknown provider '%s'(forgotten import?)", name)
|
||||
}
|
||||
|
||||
p := fn()
|
||||
|
||||
return &Manager{p, opt}, p.Init(opt.Maxlifetime, opt.ProviderConfig)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue