Repository navigation
Expand file tree
/
Copy pathsession.go
More file actions
97 lines (81 loc) · 1.93 KB
/
Copy pathsession.go
File metadata and controls
97 lines (81 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package flow
import (
"fmt"
"sync"
"time"
"github.com/go-think/flow/session"
)
// --- Begin manager.go ---
type Config struct {
// Default Session Driver
Driver string
CookieName string
// Session Lifetime
Lifetime time.Duration
// Session Encryption
Encrypt bool
// Session File Location
Files string
}
type Manager struct {
Config *Config
handlers map[string]session.SessionHandler
mu sync.RWMutex
}
func NewManager(config *Config) *Manager {
return &Manager{
Config: config,
handlers: make(map[string]session.SessionHandler),
}
}
// Extend registers a custom session driver on this Manager instance.
func (m *Manager) Extend(driver string, handler session.SessionHandler) *Manager {
m.mu.Lock()
defer m.mu.Unlock()
if m.handlers == nil {
m.handlers = make(map[string]session.SessionHandler)
}
m.handlers[driver] = handler
return m
}
func (m *Manager) SessionStart(req *Request) *session.Store {
storeHandler := m.parseStoreHandler()
store := session.NewStore(m.Config.CookieName, storeHandler)
if handler, ok := storeHandler.(*session.CookieHandler); ok {
handler.SetRequest(req)
}
cookieId, _ := req.Cookie(store.GetName())
store.SetId(cookieId)
store.Start()
return store
}
func (m *Manager) SessionSave(res *Response, store *session.Store) {
if store == nil {
return
}
if handler, ok := store.GetHandler().(*session.CookieHandler); ok {
handler.SetResponse(res)
}
_ = res.Cookie(store.GetName(), store.GetId())
store.Save()
}
func (m *Manager) parseStoreHandler() session.SessionHandler {
switch m.Config.Driver {
case "cookie":
return &session.CookieHandler{}
case "file":
return &session.FileHandler{
Path: m.Config.Files,
Lifetime: m.Config.Lifetime,
}
default:
m.mu.RLock()
handler, ok := m.handlers[m.Config.Driver]
m.mu.RUnlock()
if ok {
return handler
}
panic(fmt.Sprintf("Unsupported session driver: %s", m.Config.Driver))
}
}
// --- End manager.go ---