diff --git a/.travis.yml b/.travis.yml index 0507dc1..fe2a8c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ sudo: false language: go go: - 1.7 + - 1.8 before_install: - go get -t -v ./... - go get github.com/mattn/goveralls diff --git a/README.md b/README.md index 10c23bc..cca25d1 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ func main() { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) if session.UserID == "" { session.UserID = "x" session.Name = "y" @@ -64,4 +64,8 @@ func main() { ## Other Store Implementations -* https://github.com/mushroomsir/session-redis -Redis \ No newline at end of file +* https://github.com/mushroomsir/session-redis -Redis + +## Other Application Implementations + +* https://github.com/teambition/gear-session \ No newline at end of file diff --git a/cookiestore.go b/cookiestore.go index 241c86c..fc23767 100644 --- a/cookiestore.go +++ b/cookiestore.go @@ -6,11 +6,8 @@ import "github.com/go-http-utils/cookie" // // Fields are a subset of http.Cookie fields. type Options struct { - Path string - Domain string - // MaxAge=0 means no 'Max-Age' attribute specified. - // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'. - // MaxAge>0 means Max-Age attribute present and given in seconds. + Path string + Domain string MaxAge int Secure bool HTTPOnly bool @@ -45,8 +42,9 @@ type CookieStore struct { func (c *CookieStore) Load(name string, session Sessions, cookie *cookie.Cookies) error { val, err := cookie.Get(name, c.opts.Signed) if val != "" { - Decode(val, &session) + err = Decode(val, &session) } + // should call Init even if err session.Init(name, val, cookie, c, val) return err } diff --git a/example/main.go b/example/main.go index 9e419ef..0c72ed1 100644 --- a/example/main.go +++ b/example/main.go @@ -32,7 +32,7 @@ func main() { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) if session.UserID == "" { session.UserID = "x" session.Name = "y" @@ -49,7 +49,7 @@ func main() { store = sessions.New() handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) println(session.UserID) println(session.Name) diff --git a/sessions.go b/sessions.go index c7a6766..4bd8310 100644 --- a/sessions.go +++ b/sessions.go @@ -9,6 +9,10 @@ import ( // Store is an interface for custom session stores. type Store interface { + // Load should load data from cookie and store, set it into session instance. + // error indicates that session validation failed, or other thing. + // Sessions.Init should be called in Load, even if error occured. + Load(name string, session Sessions, cookie *cookie.Cookies) error // Save should persist session to the underlying store implementation. Save(session Sessions) error } diff --git a/sessions_test.go b/sessions_test.go index 702e876..06c19e4 100644 --- a/sessions_test.go +++ b/sessions_test.go @@ -37,7 +37,7 @@ func TestSessions(t *testing.T) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) session.Name = "mushroom" session.Age = 99 err = session.Save() @@ -54,7 +54,7 @@ func TestSessions(t *testing.T) { store = sessions.New() handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) assert.Equal("mushroom", session.Name) assert.Equal(int64(99), session.Age) @@ -71,7 +71,7 @@ func TestSessions(t *testing.T) { store = sessions.New() handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) assert.Equal("mushroom", session.Name) assert.Equal(int64(99), session.Age) @@ -88,13 +88,13 @@ func TestSessions(t *testing.T) { store := sessions.New() handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) session.Name = "mushroom" session.Age = 99 session.Save() session = &Session{Meta: &sessions.Meta{}} - store.Load(NewSessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(NewSessionName, session, cookie.New(w, r, SessionKeys...)) session.Name = "mushroomnew" session.Age = 100 session.Save() @@ -109,13 +109,13 @@ func TestSessions(t *testing.T) { store = sessions.New() handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) assert.Equal("mushroom", session.Name) assert.Equal(int64(99), session.Age) session = &Session{Meta: &sessions.Meta{}} - store.Load(NewSessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(NewSessionName, session, cookie.New(w, r, SessionKeys...)) assert.Equal("mushroomnew", session.Name) assert.Equal(int64(100), session.Age) @@ -140,7 +140,7 @@ func TestSessions(t *testing.T) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) session.Name = "mushroom" session.Age = 99 @@ -177,7 +177,7 @@ func TestSessions(t *testing.T) { store := sessions.New() handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) session.Name = "mushroom" session.Age = 99 @@ -192,7 +192,7 @@ func TestSessions(t *testing.T) { store = sessions.New() handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &Session{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) session.Name = "mushroom" session.Age = 99 session.Save() @@ -233,7 +233,7 @@ func TestSessionCompatible(t *testing.T) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session := &TbSession{Meta: &sessions.Meta{}} - store.Load(SessionName, session, cookie.New(w, r, SessionKeys)) + store.Load(SessionName, session, cookie.New(w, r, SessionKeys...)) assert.Equal(int64(1485158874813), session.AuthUpdated) assert.Equal("http://project.ci/projects", session.NextURL)