SessionFiles done...
This commit is contained in:
parent
44330e3eab
commit
045163310e
2 changed files with 34 additions and 11 deletions
|
@ -12,6 +12,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
//"git.mtux.eu/darkgopher/session"
|
//"git.mtux.eu/darkgopher/session"
|
||||||
|
"git.mtux.eu/darkgopher/session"
|
||||||
"github.com/djherbis/atime"
|
"github.com/djherbis/atime"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -24,7 +25,7 @@ var pder *ProviderFiles
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
pder = &ProviderFiles{}
|
pder = &ProviderFiles{}
|
||||||
//session.Register("files", pder)
|
session.Register("files", pder)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ckdirpath return filename from sid
|
// ckdirpath return filename from sid
|
||||||
|
@ -63,7 +64,7 @@ func (pder *ProviderFiles) SetParams(p any) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init create empty session file if not exists and retturn *Session
|
// Init create empty session file if not exists and retturn *Session
|
||||||
func (pder *ProviderFiles) Init(sid string) (sess *SessionFile, err error) {
|
func (pder *ProviderFiles) Init(sid string) (sess session.Session, err error) {
|
||||||
pder.lock.Lock()
|
pder.lock.Lock()
|
||||||
defer pder.lock.Unlock()
|
defer pder.lock.Unlock()
|
||||||
var fd *os.File
|
var fd *os.File
|
||||||
|
@ -75,11 +76,11 @@ func (pder *ProviderFiles) Init(sid string) (sess *SessionFile, err error) {
|
||||||
sess = &SessionFile{sid}
|
sess = &SessionFile{sid}
|
||||||
ssel := pder.list.PushBack(sess)
|
ssel := pder.list.PushBack(sess)
|
||||||
pder.sessions[sid] = ssel
|
pder.sessions[sid] = ssel
|
||||||
return
|
return sess, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load return existing session by sid or new session if not exists
|
// Load return existing session by sid or new session if not exists
|
||||||
func (pder *ProviderFiles) Load(sid string) (sess *SessionFile, err error) {
|
func (pder *ProviderFiles) Load(sid string) (sess session.Session, err error) {
|
||||||
pder.lock.Lock()
|
pder.lock.Lock()
|
||||||
defer pder.lock.Unlock()
|
defer pder.lock.Unlock()
|
||||||
if pder.Exists(sid) {
|
if pder.Exists(sid) {
|
||||||
|
@ -103,17 +104,16 @@ func (pder *ProviderFiles) Destroy(sid string) (err error) {
|
||||||
|
|
||||||
// ChangeID change oldsid to newsid and preserve session data
|
// ChangeID change oldsid to newsid and preserve session data
|
||||||
func (pder *ProviderFiles) ChangeID(oldsid, newsid string) (err error) {
|
func (pder *ProviderFiles) ChangeID(oldsid, newsid string) (err error) {
|
||||||
/*if ssel, ok := pder.sessions[oldsid]; ok {
|
if ssel, ok := pder.sessions[oldsid]; ok {
|
||||||
ckfold := ckdirpath(oldsid)
|
ckfold := ckdirpath(oldsid)
|
||||||
ckfnew := ckdirpath(newsid)
|
ckfnew := ckdirpath(newsid)
|
||||||
if err = os.Rename(ckfold, ckfnew); err != nil {
|
if err = os.Rename(ckfold, ckfnew); err != nil {
|
||||||
return fmt.Errorf("Rename cookie file: %s to: %s failed: %v", ckfold, ckfnew, err)
|
return fmt.Errorf("Rename cookie file: %s to: %s failed: %v", ckfold, ckfnew, err)
|
||||||
}
|
}
|
||||||
oldssel := pder.sessions[oldsid]
|
ssel.Value.(*SessionFile).sid = newsid
|
||||||
pder.list.Remove(oldssel)
|
|
||||||
delete(pder.sessions, oldsid)
|
delete(pder.sessions, oldsid)
|
||||||
}*/
|
pder.sessions[newsid] = ssel
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,6 +126,30 @@ func (pder *ProviderFiles) Exists(sid string) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GC periodically remove old sessions rom storages
|
||||||
|
func (pder *ProviderFiles) GC(maxlifetime int64) {
|
||||||
|
pder.lock.Lock()
|
||||||
|
defer pder.lock.Unlock()
|
||||||
|
for {
|
||||||
|
ssel := pder.list.Back()
|
||||||
|
if ssel == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
sid := ssel.Value.(*SessionFile).sid
|
||||||
|
var at time.Time
|
||||||
|
var err error
|
||||||
|
if at, err = pder.getAtime(sid); err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if at.UnixMilli()+(maxlifetime*session.MilisPerSec()) < time.Now().UnixMilli() {
|
||||||
|
pder.list.Remove(ssel)
|
||||||
|
delete(pder.sessions, sid)
|
||||||
|
ckf := ckdirpath(sid)
|
||||||
|
os.Remove(ckf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SessionFile save session data into files using gob encode/dacode
|
// SessionFile save session data into files using gob encode/dacode
|
||||||
type SessionFile struct {
|
type SessionFile struct {
|
||||||
sid string
|
sid string
|
||||||
|
|
|
@ -85,9 +85,8 @@ func (pder *ProviderMemory) ChangeID(oldsid, newsid string) (err error) {
|
||||||
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 //set internal sid to new
|
ssel.Value.(*SessionMemory).sid = newsid //set internal sid to new
|
||||||
le := pder.sessions[oldsid] //get list el with old sid
|
|
||||||
delete(pder.sessions, oldsid) //remove old sid in map
|
delete(pder.sessions, oldsid) //remove old sid in map
|
||||||
pder.sessions[newsid] = le //add new sid into map
|
pder.sessions[newsid] = ssel //add new sid into map
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue