...
1 package sessions
2
3 import (
4 "log"
5 "net/http"
6
7 "github.com/gin-gonic/gin"
8 "github.com/gorilla/context"
9 "github.com/gorilla/sessions"
10 )
11
12 const (
13 DefaultKey = "github.com/gin-contrib/sessions"
14 errorFormat = "[sessions] ERROR! %s\n"
15 )
16
17 type Store interface {
18 sessions.Store
19 Options(Options)
20 }
21
22
23
24 type Session interface {
25
26 ID() string
27
28 Get(key interface{}) interface{}
29
30 Set(key interface{}, val interface{})
31
32 Delete(key interface{})
33
34 Clear()
35
36
37
38 AddFlash(value interface{}, vars ...string)
39
40
41
42 Flashes(vars ...string) []interface{}
43
44 Options(Options)
45
46 Save() error
47 }
48
49 func Sessions(name string, store Store) gin.HandlerFunc {
50 return func(c *gin.Context) {
51 s := &session{name, c.Request, store, nil, false, c.Writer}
52 c.Set(DefaultKey, s)
53 defer context.Clear(c.Request)
54 c.Next()
55 }
56 }
57
58 func SessionsMany(names []string, store Store) gin.HandlerFunc {
59 return func(c *gin.Context) {
60 sessions := make(map[string]Session, len(names))
61 for _, name := range names {
62 sessions[name] = &session{name, c.Request, store, nil, false, c.Writer}
63 }
64 c.Set(DefaultKey, sessions)
65 defer context.Clear(c.Request)
66 c.Next()
67 }
68 }
69
70 type session struct {
71 name string
72 request *http.Request
73 store Store
74 session *sessions.Session
75 written bool
76 writer http.ResponseWriter
77 }
78
79 func (s *session) ID() string {
80 return s.Session().ID
81 }
82
83 func (s *session) Get(key interface{}) interface{} {
84 return s.Session().Values[key]
85 }
86
87 func (s *session) Set(key interface{}, val interface{}) {
88 s.Session().Values[key] = val
89 s.written = true
90 }
91
92 func (s *session) Delete(key interface{}) {
93 delete(s.Session().Values, key)
94 s.written = true
95 }
96
97 func (s *session) Clear() {
98 for key := range s.Session().Values {
99 s.Delete(key)
100 }
101 }
102
103 func (s *session) AddFlash(value interface{}, vars ...string) {
104 s.Session().AddFlash(value, vars...)
105 s.written = true
106 }
107
108 func (s *session) Flashes(vars ...string) []interface{} {
109 s.written = true
110 return s.Session().Flashes(vars...)
111 }
112
113 func (s *session) Options(options Options) {
114 s.written = true
115 s.Session().Options = options.ToGorillaOptions()
116 }
117
118 func (s *session) Save() error {
119 if s.Written() {
120 e := s.Session().Save(s.request, s.writer)
121 if e == nil {
122 s.written = false
123 }
124 return e
125 }
126 return nil
127 }
128
129 func (s *session) Session() *sessions.Session {
130 if s.session == nil {
131 var err error
132 s.session, err = s.store.Get(s.request, s.name)
133 if err != nil {
134 log.Printf(errorFormat, err)
135 }
136 }
137 return s.session
138 }
139
140 func (s *session) Written() bool {
141 return s.written
142 }
143
144
145 func Default(c *gin.Context) Session {
146 return c.MustGet(DefaultKey).(Session)
147 }
148
149
150 func DefaultMany(c *gin.Context, name string) Session {
151 return c.MustGet(DefaultKey).(map[string]Session)[name]
152 }
153
View as plain text