🩹 fix session test

Co-Authored-By: RW <7063188+ReneWerner87@users.noreply.github.com>
pull/1025/head
Fenny 2020-11-17 08:15:22 +01:00
parent cdba739a40
commit e44da45bff
3 changed files with 51 additions and 95 deletions

View File

@ -24,10 +24,21 @@ var sessionPool = sync.Pool{
}
func acquireSession() *Session {
return sessionPool.Get().(*Session)
s := sessionPool.Get().(*Session)
if s.data == nil {
s.data = new(data)
}
s.fresh = true
return s
}
func releaseSession(s *Session) {
s.id = ""
s.ctx = nil
s.config = nil
if s.data != nil {
s.data.Reset()
}
sessionPool.Put(s)
}
@ -79,14 +90,8 @@ func (s *Session) Destroy() error {
s.data.Reset()
// Use external Storage if exist
if s.config.Storage != nil {
if err := s.config.Storage.Delete(s.id); err != nil {
return err
}
} else {
s.config.mux.Lock()
delete(s.config.sessions, s.id)
s.config.mux.Unlock()
if err := s.config.Storage.Delete(s.id); err != nil {
return err
}
// Expire cookie
@ -96,16 +101,10 @@ func (s *Session) Destroy() error {
// Regenerate generates a new session id and delete the old one from Storage
func (s *Session) Regenerate() error {
// Use external Storage if exist
if s.config.Storage != nil {
// Delete old id from storage
if err := s.config.Storage.Delete(s.id); err != nil {
return err
}
} else {
s.config.mux.Lock()
delete(s.config.sessions, s.id)
s.config.mux.Unlock()
// Delete old id from storage
if err := s.config.Storage.Delete(s.id); err != nil {
return err
}
// Create new ID
@ -126,32 +125,22 @@ func (s *Session) Save() error {
return nil
}
// Use external Storage if exist
if s.config.Storage != nil {
// Convert book to bytes
data, err := s.data.MarshalMsg(nil)
if err != nil {
return err
}
// Convert data to bytes
data, err := s.data.MarshalMsg(nil)
if err != nil {
return err
}
// pass raw bytes with session id to provider
if err := s.config.Storage.Set(s.id, data, s.config.Expiration); err != nil {
return err
}
} else {
s.config.mux.Lock()
s.config.sessions[s.id] = s.data
s.config.mux.Unlock()
// pass raw bytes with session id to provider
if err := s.config.Storage.Set(s.id, data, s.config.Expiration); err != nil {
return err
}
// Create cookie with the session ID
s.setCookie()
// Release data if we use a Storage
if s.config.Storage != nil {
releaseData(s.data)
}
// Release session
// TODO: It's not safe to use the Session after called Save()
releaseSession(s)
return nil

View File

@ -1,15 +1,12 @@
package session
import (
"sync"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/internal/storage/memory"
)
type Store struct {
Config
mux *sync.RWMutex
sessions map[string]*data
}
// Storage ErrNotExist
@ -19,86 +16,55 @@ func New(config ...Config) *Store {
// Set default config
cfg := configDefault(config...)
// Create Store object
store := &Store{
Config: cfg,
}
// Default store logic (if no Storage is provided)
if cfg.Storage == nil {
store.mux = &sync.RWMutex{}
store.sessions = make(map[string]*data)
cfg.Storage = memory.New()
}
return store
return &Store{
cfg,
}
}
func (s *Store) Get(c *fiber.Ctx) (*Session, error) {
var fresh bool
// Get session id from cookie
// Get key from cookie
id := c.Cookies(s.CookieName)
// Create key if not exist
// If no key exist, create new one
if len(id) == 0 {
id = s.KeyGenerator()
fresh = true
}
// Get session object from pool
// Create session object
sess := acquireSession()
sess.id = id
sess.fresh = fresh
sess.ctx = c
sess.config = s
sess.id = id
sess.fresh = fresh
// Get session data if not fresh
if !sess.fresh {
// Use external Storage if exist
if s.Storage != nil {
raw, err := s.Storage.Get(id)
// Unmashal if we found data
if err == nil {
sess.data = acquireData()
if _, err = sess.data.UnmarshalMsg(raw); err != nil {
return nil, err
}
} else if err.Error() != errNotExist {
// Only return error if it's not ErrNotExist
// Fetch existing data
if !fresh {
raw, err := s.Storage.Get(id)
// Unmashal if we found data
if err == nil {
if _, err = sess.data.UnmarshalMsg(raw); err != nil {
return nil, err
} else {
// No data was found, this is now a fresh session
sess.fresh = true
}
sess.fresh = false
} else if err.Error() != errNotExist {
// Only return error if it's not ErrNotExist
return nil, err
} else {
// Find data in local memory map
s.mux.RLock()
data, ok := s.sessions[id]
s.mux.RUnlock()
if ok && data != nil {
sess.data = data
} else {
// No data was found, this is now a fresh session
sess.fresh = true
}
sess.fresh = true
}
}
// Get new kv store if nil
if sess.data == nil {
sess.data = acquireData()
}
return sess, nil
}
// Reset will delete all session from the storage
func (s *Store) Reset() error {
if s.Storage != nil {
return s.Storage.Reset()
}
s.mux.Lock()
s.sessions = make(map[string]*data)
s.mux.Unlock()
return nil
return s.Storage.Reset()
}

View File

@ -148,6 +148,7 @@ func Benchmark_Trim(b *testing.B) {
})
}
// go test -v -run=^$ -bench=Benchmark_EqualFold -benchmem -count=4
func Benchmark_EqualFold(b *testing.B) {
var left = "/RePos/GoFiBer/FibEr/iSsues/187643/CoMmEnts"
var right = "/RePos/goFiber/Fiber/issues/187643/COMMENTS"