diff --git a/session.go b/session.go index 139f62d..4718eb7 100644 --- a/session.go +++ b/session.go @@ -79,30 +79,29 @@ func Register(name string, provide Provider) { // Manager controls all sessions with registered storage provider type Manager struct { - cookieName string - provider Provider - maxlifetime int64 - secure bool + provider Provider + sessOpts *SessOpts + addOpts any } // SessOpts set session options or NewManager type SessOpts struct { - ProviderName string - CookieName string - MaxLifetime int64 - Ssl bool + CookieName string + MaxLifetime int64 + Ssl bool } -// NewManager create new *Manager for provideName, cookieName and maxlifetime in seconds -func NewManager(sopts SessOpts, adopts any) (*Manager, error) { - var provider Provider +// NewManager create new *Manager using SesOpts and aditional any other opts +func NewManager(providerName string, sopts *SessOpts, adopts any) (*Manager, error) { + var prv Provider var ok bool - if provider, ok = provides[sopts.ProviderName]; !ok { - return nil, fmt.Errorf("session: Provider: %q not found (forgotten import?)", sopts.ProviderName) + if prv, ok = provides[providerName]; !ok { + return nil, fmt.Errorf("session: Provider: %q not found (forgotten import?)", providerName) } m := &Manager{ - cookieName: sopts.CookieName, provider: provider, - maxlifetime: sopts.MaxLifetime, secure: sopts.Ssl, + provider: prv, + sessOpts: sopts, + addOpts: adopts, } go m.GC() return m, nil @@ -121,7 +120,7 @@ func (manager *Manager) sessionID() (sid string, err error) { func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (session Session, err error) { var cookie *http.Cookie var sid string - if cookie, err = r.Cookie(manager.cookieName); err != nil || cookie == nil { + if cookie, err = r.Cookie(manager.sessOpts.CookieName); err != nil || cookie == nil { if sid, err = manager.sessionID(); err != nil { return nil, err } @@ -129,9 +128,9 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se return nil, fmt.Errorf("Session init failed: %w", err) } cookie := http.Cookie{ - Name: manager.cookieName, Value: url.QueryEscape(sid), Path: "/", - HttpOnly: true, MaxAge: int(manager.maxlifetime), - Secure: manager.secure, + Name: manager.sessOpts.CookieName, Value: url.QueryEscape(sid), Path: "/", + HttpOnly: true, MaxAge: int(manager.sessOpts.MaxLifetime), + Secure: manager.sessOpts.Ssl, } http.SetCookie(w, &cookie) } else { @@ -148,14 +147,14 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se // SessionDestroy end session and delete session data at the server func (manager *Manager) SessionDestroy(w http.ResponseWriter, r *http.Request) (err error) { var cookie *http.Cookie - if cookie, err = r.Cookie(manager.cookieName); err != nil || cookie.Value == "" { + if cookie, err = r.Cookie(manager.sessOpts.CookieName); err != nil || cookie.Value == "" { return fmt.Errorf("Get cookie from request failed: %v", err) } manager.provider.Destroy(cookie.Value) rmcookie := http.Cookie{ - Name: manager.cookieName, Path: "/", HttpOnly: true, - Expires: time.Now(), MaxAge: -1, Secure: manager.secure, + Name: manager.sessOpts.CookieName, Path: "/", HttpOnly: true, + Expires: time.Now(), MaxAge: -1, Secure: manager.sessOpts.Ssl, } http.SetCookie(w, &rmcookie) return nil @@ -168,7 +167,7 @@ func (manager *Manager) Exists(sid string) bool { // RegenerateID vhange sid and preserve all session data func (manager *Manager) RegenerateID(w http.ResponseWriter, r *http.Request) { - if ck, err := r.Cookie(manager.cookieName); err == nil && ck.Value != "" { + if ck, err := r.Cookie(manager.sessOpts.CookieName); err == nil && ck.Value != "" { if newid, err := manager.sessionID(); err != nil { manager.provider.RegenerateID(ck.Value, newid) } @@ -177,7 +176,7 @@ func (manager *Manager) RegenerateID(w http.ResponseWriter, r *http.Request) { // GC remove sessions which exceeded manager.maxLifetime func (manager *Manager) GC() { - manager.provider.GC(manager.maxlifetime) - msec := milis * manager.maxlifetime + manager.provider.GC(manager.sessOpts.MaxLifetime) + msec := milis * manager.sessOpts.MaxLifetime time.AfterFunc(time.Duration(msec), func() { manager.GC() }) } diff --git a/tests/t_test.go b/tests/t_test.go index b5b3dae..9efe986 100644 --- a/tests/t_test.go +++ b/tests/t_test.go @@ -287,12 +287,12 @@ func TestRunAll(t *testing.T) { var err error jar, _ := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List}) testclient.Jar = jar - sessopts := session.SessOpts{ - ProviderName: "memory", CookieName: sid, + sessopts := &session.SessOpts{ + CookieName: sid, MaxLifetime: 180, Ssl: true, } - if sm, err = session.NewManager(sessopts, nil); err != nil { + if sm, err = session.NewManager(pn, sessopts, nil); err != nil { t.Errorf("Session provider %s failed initialize err: %v", pn, err) } fns := []func(t *testing.T){t1, t2, t3, t4, t5, t6, t7, t8, t9}