This repository has been archived by the owner on Oct 18, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
session.go
91 lines (77 loc) · 1.65 KB
/
session.go
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
package session
import (
"net/http"
"github.com/gorilla/context"
"github.com/gorilla/sessions"
"github.com/labstack/echo"
)
type session struct {
name string
session *sessions.Session
store sessions.Store
req *http.Request
res http.ResponseWriter
written bool
}
var Name = "session"
func Middleware(name string, store sessions.Store) echo.MiddlewareFunc {
return func(h echo.HandlerFunc) echo.HandlerFunc {
return func(ctx echo.Context) error {
req, res := ctx.Request(), ctx.Response()
ctx.Set(Name, &session{name, nil, store, req, res, false})
defer context.Clear(req)
return h(ctx)
}
}
}
func Get(ctx echo.Context) *session {
value := ctx.Get(Name)
if value == nil {
return nil
}
return value.(*session)
}
func (s *session) Save() error {
if s.written {
e := s.Session().Save(s.req, s.res)
if e == nil {
s.written = false
}
return e
}
return nil
}
func (s *session) Session() *sessions.Session {
if s.session == nil {
var err error
s.session, err = s.store.Get(s.req, s.name)
if err != nil {
panic(err)
}
}
return s.session
}
func (s *session) Get(key interface{}) interface{} {
return s.Session().Values[key]
}
func (s *session) Set(key interface{}, val interface{}) {
s.Session().Values[key] = val
s.written = true
}
func (s *session) Delete(key interface{}) {
delete(s.Session().Values, key)
s.written = true
}
func (s *session) Clear() {
for key := range s.Session().Values {
s.Delete(key)
}
}
func (s *session) Options(options *sessions.Options) {
s.Session().Options = options
}
func (s *session) Expire() error {
s.Session().Options.MaxAge = -1
s.written = true
return s.Save()
}