SessionFiles done...

This commit is contained in:
DarkGopher 2025-06-19 19:17:11 +02:00
parent 44330e3eab
commit 045163310e
2 changed files with 34 additions and 11 deletions

View file

@ -12,6 +12,7 @@ import (
"time"
//"git.mtux.eu/darkgopher/session"
"git.mtux.eu/darkgopher/session"
"github.com/djherbis/atime"
)
@ -24,7 +25,7 @@ var pder *ProviderFiles
func init() {
pder = &ProviderFiles{}
//session.Register("files", pder)
session.Register("files", pder)
}
// 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
func (pder *ProviderFiles) Init(sid string) (sess *SessionFile, err error) {
func (pder *ProviderFiles) Init(sid string) (sess session.Session, err error) {
pder.lock.Lock()
defer pder.lock.Unlock()
var fd *os.File
@ -75,11 +76,11 @@ func (pder *ProviderFiles) Init(sid string) (sess *SessionFile, err error) {
sess = &SessionFile{sid}
ssel := pder.list.PushBack(sess)
pder.sessions[sid] = ssel
return
return sess, nil
}
// 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()
defer pder.lock.Unlock()
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
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)
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)
ssel.Value.(*SessionFile).sid = newsid
delete(pder.sessions, oldsid)
}*/
pder.sessions[newsid] = ssel
}
return
}
@ -126,6 +126,30 @@ func (pder *ProviderFiles) Exists(sid string) bool {
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
type SessionFile struct {
sid string

View file

@ -85,9 +85,8 @@ func (pder *ProviderMemory) ChangeID(oldsid, newsid string) (err error) {
defer pder.lock.Unlock()
if ssel, ok := pder.sessions[oldsid]; ok {
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
pder.sessions[newsid] = le //add new sid into map
pder.sessions[newsid] = ssel //add new sid into map
}
return
}