func findSession(w http.ResponseWriter, r *http.Request, rc redis.Conn) (*Session, error) { session := new(Session) usertokenCookie, err := r.Cookie("usertoken") if err != nil { return session, lwutil.NewErr(err) } usertoken := usertokenCookie.Value //redis if rc == nil { rc = redisPool.Get() defer rc.Close() } sessionBytes, err := redis.Bytes(rc.Do("get", fmt.Sprintf("sessions/%s", usertoken))) if err != nil { return session, lwutil.NewErr(err) } err = json.Unmarshal(sessionBytes, session) lwutil.CheckError(err, "") //update session dt := time.Now().Sub(session.Born) if dt > sessionUpdateSecond*time.Second { newSession(w, session.Userid, session.Username, session.Appid, rc) } return session, nil }
func c() error { err := b() if err != nil { return lwutil.NewErr(err) } return nil }
func newSession(w http.ResponseWriter, userid uint64, username string, appid uint32, rc redis.Conn) (usertoken string, err error) { if rc == nil { rc = redisPool.Get() defer rc.Close() } usertoken = "" usertokenRaw, err := rc.Do("get", fmt.Sprintf("usertokens/%d+%d", userid, appid)) lwutil.CheckError(err, "") if usertokenRaw != nil { if usertoken, err := redis.String(usertokenRaw, err); err != nil { return usertoken, lwutil.NewErr(err) } rc.Do("del", fmt.Sprintf("sessions/%s", usertoken)) } usertoken = lwutil.GenUUID() session := Session{userid, username, time.Now(), appid} jsonSession, err := json.Marshal(session) if err != nil { return usertoken, lwutil.NewErr(err) } rc.Send("setex", fmt.Sprintf("sessions/%s", usertoken), sessionLifeSecond, jsonSession) rc.Send("setex", fmt.Sprintf("usertokens/%d+%d", userid, appid), sessionLifeSecond, usertoken) rc.Flush() for i := 0; i < 2; i++ { if _, err = rc.Receive(); err != nil { return usertoken, lwutil.NewErr(err) } } // cookie http.SetCookie(w, &http.Cookie{Name: "usertoken", Value: usertoken, MaxAge: sessionLifeSecond, Path: "/"}) return usertoken, err }