resolvepanic moved to util.ResolvePanic
This commit is contained in:
parent
77101ac9b4
commit
0a74eadccb
6 changed files with 85 additions and 18 deletions
2
go.mod
2
go.mod
|
@ -3,3 +3,5 @@ module git.mtux.eu/darkgopher/session
|
||||||
go 1.23.4
|
go 1.23.4
|
||||||
|
|
||||||
require golang.org/x/net v0.40.0
|
require golang.org/x/net v0.40.0
|
||||||
|
|
||||||
|
require github.com/djherbis/atime v1.1.0
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -1,2 +1,4 @@
|
||||||
|
github.com/djherbis/atime v1.1.0 h1:rgwVbP/5by8BvvjBNrbh64Qz33idKT3pSnMSJsxhi0g=
|
||||||
|
github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE=
|
||||||
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
|
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
|
||||||
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
|
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
|
||||||
|
|
|
@ -58,11 +58,11 @@ type Provider interface {
|
||||||
// Session interface implement storage for one session and have maxLifetime and lastAccessTime
|
// Session interface implement storage for one session and have maxLifetime and lastAccessTime
|
||||||
type Session interface {
|
type Session interface {
|
||||||
//set session value and update last access time
|
//set session value and update last access time
|
||||||
Set(key, value interface{}) error
|
Set(key, value any) error
|
||||||
//get session value and update last access time
|
//get session value and update last access time
|
||||||
Get(key interface{}) (v any, err error)
|
Get(key any) (v any, err error)
|
||||||
//delete session value
|
//delete session value
|
||||||
Delete(key interface{}) error
|
Delete(key any) error
|
||||||
//get session id
|
//get session id
|
||||||
SessionID() string
|
SessionID() string
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,15 @@
|
||||||
package files
|
package files
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"container/list"
|
||||||
|
"encoding/gob"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/djherbis/atime"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -19,8 +24,9 @@ func init() {
|
||||||
|
|
||||||
// ProviderFiles implement filesystem session provider
|
// ProviderFiles implement filesystem session provider
|
||||||
type ProviderFiles struct {
|
type ProviderFiles struct {
|
||||||
sessPath string
|
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
|
list *list.List //or gc
|
||||||
|
sessPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pder *ProviderFiles) ckdirpath(sid string) string {
|
func (pder *ProviderFiles) ckdirpath(sid string) string {
|
||||||
|
@ -28,10 +34,13 @@ func (pder *ProviderFiles) ckdirpath(sid string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pder *ProviderFiles) updateAtime(sid string) (err error) {
|
func (pder *ProviderFiles) updateAtime(sid string) (err error) {
|
||||||
return
|
pth := pder.ckdirpath(sid)
|
||||||
|
return os.Chtimes(pth, time.Now(), time.Time{})
|
||||||
}
|
}
|
||||||
func (pder *ProviderFiles) getAtime(sid string) (atime *time.Time, err error) {
|
|
||||||
return
|
func (pder *ProviderFiles) getAtime(sid string) (atm time.Time, err error) {
|
||||||
|
pth := pder.ckdirpath(sid)
|
||||||
|
return atime.Stat(pth)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetParams for files session provider set base path in filesystem for save sessions
|
// SetParams for files session provider set base path in filesystem for save sessions
|
||||||
|
@ -46,7 +55,7 @@ func (pder *ProviderFiles) SetParams(p any) (err error) {
|
||||||
return fmt.Errorf("parameter for files session provider must not be nil")
|
return fmt.Errorf("parameter for files session provider must not be nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init create 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) (err error) {
|
func (pder *ProviderFiles) Init(sid string) (err error) {
|
||||||
pder.lock.Lock()
|
pder.lock.Lock()
|
||||||
defer pder.lock.Unlock()
|
defer pder.lock.Unlock()
|
||||||
|
@ -55,5 +64,56 @@ func (pder *ProviderFiles) Init(sid string) (err error) {
|
||||||
if fd, err = os.Create(ckf); err != nil {
|
if fd, err = os.Create(ckf); err != nil {
|
||||||
return fmt.Errorf("create session file: %s failed with err: %w", ckf, err)
|
return fmt.Errorf("create session file: %s failed with err: %w", ckf, err)
|
||||||
}
|
}
|
||||||
|
pder.list.PushBack(sid)
|
||||||
return fd.Close()
|
return fd.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SessionFile save session data into files using gob encode/dacode
|
||||||
|
type SessionFile struct {
|
||||||
|
sfpth string
|
||||||
|
}
|
||||||
|
|
||||||
|
// load data from session file
|
||||||
|
func (sf *SessionFile) load() (data map[any]any, err error) {
|
||||||
|
var sb []byte
|
||||||
|
if sb, err = os.ReadFile(sf.sfpth); err != nil {
|
||||||
|
return nil, fmt.Errorf("Session file: %s read error: %v", sf.sfpth, err)
|
||||||
|
}
|
||||||
|
var gobdata bytes.Buffer
|
||||||
|
if _, err = gobdata.Write(sb); err != nil {
|
||||||
|
return nil, fmt.Errorf("Load session file: %s into buffer err: %v", sf.sfpth, err)
|
||||||
|
}
|
||||||
|
dec := gob.NewDecoder(&gobdata)
|
||||||
|
if err = dec.Decode(&data); err != nil {
|
||||||
|
return nil, fmt.Errorf("Decode gob data from file: %s error: %v", sf.sfpth, err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// save data into session file
|
||||||
|
func (sf *SessionFile) save(data map[any]any) (err error) {
|
||||||
|
var gobdata bytes.Buffer
|
||||||
|
enc := gob.NewEncoder(&gobdata)
|
||||||
|
if err = enc.Encode(data); err != nil {
|
||||||
|
return fmt.Errorf("Gob encode file: %s error: %v", sf.sfpth, err)
|
||||||
|
}
|
||||||
|
if err = os.WriteFile(sf.sfpth, gobdata.Bytes(), 0o600); err != nil {
|
||||||
|
return fmt.Errorf("Write gob data into file: %s error: %v", sf.sfpth, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get value from session key k
|
||||||
|
func (sf *SessionFile) Get(k any) (v any, err error) {
|
||||||
|
var data map[any]any
|
||||||
|
if data, err = sf.load(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return data[k], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set value of key k to v
|
||||||
|
func (sf *SessionFile) Set(k, v any) (err error) {
|
||||||
|
//var data map[any]any
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.mtux.eu/darkgopher/session"
|
"git.mtux.eu/darkgopher/session"
|
||||||
|
"git.mtux.eu/darkgopher/session/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
var pder = &ProviderMemory{list: list.New()}
|
var pder = &ProviderMemory{list: list.New()}
|
||||||
|
@ -118,16 +119,10 @@ type SessionMemory struct {
|
||||||
data map[any]any
|
data map[any]any
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sm *SessionMemory) resolvepanic(err *error) {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
*err = r.(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set -
|
// Set -
|
||||||
func (sm *SessionMemory) Set(k any, v any) (err error) {
|
func (sm *SessionMemory) Set(k, v any) (err error) {
|
||||||
defer pder.updateAtime(sm.sid)
|
defer pder.updateAtime(sm.sid)
|
||||||
defer sm.resolvepanic(&err)
|
defer util.ResolvePanic(&err)
|
||||||
sm.data[k] = v
|
sm.data[k] = v
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -135,14 +130,13 @@ func (sm *SessionMemory) Set(k any, v any) (err error) {
|
||||||
// Get -
|
// Get -
|
||||||
func (sm *SessionMemory) Get(k any) (v any, err error) {
|
func (sm *SessionMemory) Get(k any) (v any, err error) {
|
||||||
defer pder.updateAtime(sm.sid)
|
defer pder.updateAtime(sm.sid)
|
||||||
defer sm.resolvepanic(&err)
|
defer util.ResolvePanic(&err)
|
||||||
return sm.data[k], err
|
return sm.data[k], err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete -
|
// Delete -
|
||||||
func (sm *SessionMemory) Delete(k any) (err error) {
|
func (sm *SessionMemory) Delete(k any) (err error) {
|
||||||
defer pder.updateAtime(sm.sid)
|
defer pder.updateAtime(sm.sid)
|
||||||
|
|
||||||
delete(sm.data, k)
|
delete(sm.data, k)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
9
util/panic.go
Normal file
9
util/panic.go
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
package util
|
||||||
|
|
||||||
|
// ResolvePanic convert panic recover to error This used
|
||||||
|
// for map[any]any value manipulations when get panic
|
||||||
|
func ResolvePanic(err *error) {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
*err = r.(error)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue