mirror of https://github.com/gofiber/fiber.git
🩹 fix session test
Co-Authored-By: RW <7063188+ReneWerner87@users.noreply.github.com>pull/1025/head
parent
cdba739a40
commit
e44da45bff
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue