// Save adds a single session to the response. func (s *redisStore) Save(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { var err error if session.ID == "" { var i uint64 i, err = NoeqClient.GenOne() if err != nil { return err } session.ID = strconv.FormatUint(i, 10) } if err = s.save(session); err != nil { return err } var encoded string encoded, err = securecookie.EncodeMulti(session.Name(), &session.ID, s.Codecs...) if err != nil { return err } options := s.Options if session.Options != nil { options = session.Options } cookie := &http.Cookie{ Name: session.Name(), Value: encoded, Path: options.Path, Domain: options.Domain, MaxAge: options.MaxAge, Secure: options.Secure, HttpOnly: options.HttpOnly, } http.SetCookie(w, cookie) context.DefaultContext.Clear(r) return nil }
func (s *MongoStore) load(session *sessions.Session) error { mg := &MgSessionTbl{SessionID: []byte(session.ID)} err := s.DBCollection.Find(bson.M{"sessionid": []byte(session.ID)}).One(mg) if err == nil { err = securecookie.DecodeMulti(session.Name(), string(mg.Encoded), &session.Values, s.Codecs...) } return err }
func (s *MongoStore) save(session *sessions.Session) error { encoded, err := securecookie.EncodeMulti(session.Name(), session.Values, s.Codecs...) if err != nil { return err } mg := &MgSessionTbl{ Encoded: encoded, SessionID: []byte(session.ID), Age: bson.Now(), } _, err = s.DBCollection.Upsert(bson.M{"sessionid": session.ID}, mg) return err }
// Save adds a single session to the response. func (s *DatastoreStore) Save(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { if session.ID == "" { session.ID = string(securecookie.GenerateRandomKey(32)) } if err := s.save(r, session); err != nil { return err } encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.Codecs...) if err != nil { return err } http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options)) return nil }
// load reads a file and decodes its content into session.Values. func (s *redisStore) load(session *sessions.Session) error { if session.Name() == "remember" { return nil } key := "session:" + session.ID se, rerr := RedisClient.Get(key) if rerr != nil { return rerr } ss := se.String() if ss == "" { return nil } err := securecookie.DecodeMulti(session.Name(), ss, &session.Values, s.Codecs...) if err != nil { return err } return nil }
// save writes encoded session.Values to a file. func (s *redisStore) save(session *sessions.Session) error { if session.Name() == "remember" { return nil } if len(session.Values) == 0 { // Don't need to write anything. return nil } encoded, err := securecookie.EncodeMulti(session.Name(), &session.Values, s.Codecs...) if err != nil { return err } d := make(chan bool) saves <- &sessionAction{"session:" + session.ID, int64(sessionExpire), encoded, d} f := <-d if !f { return cantSave } return nil }