no list.Remove() need or ChangeID
This commit is contained in:
parent
ffd730b057
commit
44330e3eab
2 changed files with 42 additions and 10 deletions
|
@ -27,6 +27,7 @@ func init() {
|
||||||
//session.Register("files", pder)
|
//session.Register("files", pder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ckdirpath return filename from sid
|
||||||
func ckdirpath(sid string) string {
|
func ckdirpath(sid string) string {
|
||||||
return fmt.Sprintf("%s/%s/%s.%s", pder.sessPath, sessDir, sid, sessExt)
|
return fmt.Sprintf("%s/%s/%s.%s", pder.sessPath, sessDir, sid, sessExt)
|
||||||
}
|
}
|
||||||
|
@ -34,6 +35,7 @@ func ckdirpath(sid string) string {
|
||||||
// ProviderFiles implement filesystem session provider
|
// ProviderFiles implement filesystem session provider
|
||||||
type ProviderFiles struct {
|
type ProviderFiles struct {
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
|
sessions map[string]*list.Element
|
||||||
list *list.List //or gc
|
list *list.List //or gc
|
||||||
sessPath string
|
sessPath string
|
||||||
}
|
}
|
||||||
|
@ -70,8 +72,10 @@ func (pder *ProviderFiles) Init(sid string) (sess *SessionFile, err error) {
|
||||||
return nil, fmt.Errorf("create session file: %s failed with err: %w", ckf, err)
|
return nil, fmt.Errorf("create session file: %s failed with err: %w", ckf, err)
|
||||||
}
|
}
|
||||||
defer fd.Close()
|
defer fd.Close()
|
||||||
pder.list.PushBack(sid)
|
sess = &SessionFile{sid}
|
||||||
return &SessionFile{sid}, nil
|
ssel := pder.list.PushBack(sess)
|
||||||
|
pder.sessions[sid] = ssel
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load return existing session by sid or new session if not exists
|
// Load return existing session by sid or new session if not exists
|
||||||
|
@ -79,11 +83,40 @@ func (pder *ProviderFiles) Load(sid string) (sess *SessionFile, err error) {
|
||||||
pder.lock.Lock()
|
pder.lock.Lock()
|
||||||
defer pder.lock.Unlock()
|
defer pder.lock.Unlock()
|
||||||
if pder.Exists(sid) {
|
if pder.Exists(sid) {
|
||||||
return &SessionFile{sid}, nil
|
return pder.sessions[sid].Value.(*SessionFile), nil
|
||||||
}
|
}
|
||||||
return pder.Init(sid)
|
return pder.Init(sid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Destroy remove session file
|
||||||
|
func (pder *ProviderFiles) Destroy(sid string) (err error) {
|
||||||
|
pder.lock.Lock()
|
||||||
|
defer pder.lock.Unlock()
|
||||||
|
if pder.Exists(sid) {
|
||||||
|
ssel := pder.sessions[sid]
|
||||||
|
delete(pder.sessions, sid)
|
||||||
|
pder.list.Remove(ssel)
|
||||||
|
return os.Remove(ckdirpath(sid))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeID change oldsid to newsid and preserve session data
|
||||||
|
func (pder *ProviderFiles) ChangeID(oldsid, newsid string) (err error) {
|
||||||
|
/*if ssel, ok := pder.sessions[oldsid]; ok {
|
||||||
|
ckfold := ckdirpath(oldsid)
|
||||||
|
ckfnew := ckdirpath(newsid)
|
||||||
|
if err = os.Rename(ckfold, ckfnew); err != nil {
|
||||||
|
return fmt.Errorf("Rename cookie file: %s to: %s failed: %v", ckfold, ckfnew, err)
|
||||||
|
}
|
||||||
|
oldssel := pder.sessions[oldsid]
|
||||||
|
pder.list.Remove(oldssel)
|
||||||
|
delete(pder.sessions, oldsid)
|
||||||
|
}*/
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Exists check if session sid exists in storage
|
// Exists check if session sid exists in storage
|
||||||
func (pder *ProviderFiles) Exists(sid string) bool {
|
func (pder *ProviderFiles) Exists(sid string) bool {
|
||||||
ckf := ckdirpath(sid)
|
ckf := ckdirpath(sid)
|
||||||
|
|
|
@ -57,7 +57,7 @@ func (pder *ProviderMemory) Exists(sid string) (ex bool) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// read return existing unexpired session or create new
|
// Load return existing unexpired session or create new
|
||||||
func (pder *ProviderMemory) Load(sid string) (ses session.Session, err error) {
|
func (pder *ProviderMemory) Load(sid string) (ses session.Session, err error) {
|
||||||
pder.lock.Lock()
|
pder.lock.Lock()
|
||||||
defer pder.lock.Unlock()
|
defer pder.lock.Unlock()
|
||||||
|
@ -72,8 +72,8 @@ func (pder *ProviderMemory) Destroy(sid string) (err error) {
|
||||||
pder.lock.Lock()
|
pder.lock.Lock()
|
||||||
defer pder.lock.Unlock()
|
defer pder.lock.Unlock()
|
||||||
if ssel, ok := pder.sessions[sid]; ok {
|
if ssel, ok := pder.sessions[sid]; ok {
|
||||||
delete(pder.sessions, sid)
|
|
||||||
pder.list.Remove(ssel)
|
pder.list.Remove(ssel)
|
||||||
|
delete(pder.sessions, sid)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
@ -84,11 +84,10 @@ func (pder *ProviderMemory) ChangeID(oldsid, newsid string) (err error) {
|
||||||
pder.lock.Lock()
|
pder.lock.Lock()
|
||||||
defer pder.lock.Unlock()
|
defer pder.lock.Unlock()
|
||||||
if ssel, ok := pder.sessions[oldsid]; ok {
|
if ssel, ok := pder.sessions[oldsid]; ok {
|
||||||
ssel.Value.(*SessionMemory).sid = newsid
|
ssel.Value.(*SessionMemory).sid = newsid //set internal sid to new
|
||||||
le := pder.sessions[oldsid]
|
le := pder.sessions[oldsid] //get list el with old sid
|
||||||
pder.list.Remove(le)
|
delete(pder.sessions, oldsid) //remove old sid in map
|
||||||
delete(pder.sessions, oldsid)
|
pder.sessions[newsid] = le //add new sid into map
|
||||||
pder.sessions[newsid] = ssel
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue