update
This commit is contained in:
parent
451e03c30f
commit
6180d20b97
4 changed files with 84 additions and 58 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -24,3 +24,5 @@ _testmain.go
|
||||||
|
|
||||||
*.db
|
*.db
|
||||||
*.out
|
*.out
|
||||||
|
go.mod
|
||||||
|
go.sum
|
|
@ -9,13 +9,7 @@ import (
|
||||||
func TestConfig_setDefault(t *testing.T) {
|
func TestConfig_setDefault(t *testing.T) {
|
||||||
config := Config{}
|
config := Config{}
|
||||||
config.setDefault()
|
config.setDefault()
|
||||||
if config.SessionOptions.Path != shared.DefaultPath {
|
|
||||||
t.Errorf("config.SessionOptions.Path should be %s (actual: %s)", shared.DefaultPath, config.SessionOptions.Path)
|
|
||||||
}
|
|
||||||
if config.SessionOptions.MaxAge != shared.DefaultMaxAge {
|
|
||||||
t.Errorf("config.SessionOptions.MaxAge should be %s (actual: %s)", shared.DefaultMaxAge, config.SessionOptions.MaxAge)
|
|
||||||
}
|
|
||||||
if string(config.DBOptions.BucketName) != shared.DefaultBucketName {
|
if string(config.DBOptions.BucketName) != shared.DefaultBucketName {
|
||||||
t.Errorf("config.SessionOptions.BucketName should be %+v (actual: %+v)", shared.DefaultBucketName, config.DBOptions.BucketName)
|
t.Errorf("config.SessionOptions.BucketName should be %+v (actual: %+v)", shared.DefaultBucketName, string(config.DBOptions.BucketName))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ func (s *Store) Reload(ctx echo.Context, session *sessions.Session) error {
|
||||||
// Save adds a single session to the response.
|
// Save adds a single session to the response.
|
||||||
func (s *Store) Save(ctx echo.Context, session *sessions.Session) error {
|
func (s *Store) Save(ctx echo.Context, session *sessions.Session) error {
|
||||||
if ctx.CookieOptions().MaxAge < 0 {
|
if ctx.CookieOptions().MaxAge < 0 {
|
||||||
s.Remove(session.ID)
|
s.delete(session)
|
||||||
sessions.SetCookie(ctx, session.Name(), "")
|
sessions.SetCookie(ctx, session.Name(), "")
|
||||||
} else {
|
} else {
|
||||||
// Build an alphanumeric ID.
|
// Build an alphanumeric ID.
|
||||||
|
@ -112,6 +112,11 @@ func (s *Store) Remove(sessionID string) error {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// delete removes the key-value from the database.
|
||||||
|
func (s *Store) delete(session *sessions.Session) error {
|
||||||
|
return s.Remove(session.ID)
|
||||||
|
}
|
||||||
|
|
||||||
// save stores the session data in the database.
|
// save stores the session data in the database.
|
||||||
func (s *Store) save(ctx echo.Context, session *sessions.Session) error {
|
func (s *Store) save(ctx echo.Context, session *sessions.Session) error {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
|
@ -10,11 +10,14 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
|
"github.com/webx-top/echo"
|
||||||
|
"github.com/webx-top/echo/defaults"
|
||||||
|
"github.com/webx-top/echo/engine/mock"
|
||||||
|
|
||||||
"github.com/admpub/boltstore/shared"
|
"github.com/admpub/boltstore/shared"
|
||||||
|
"github.com/admpub/securecookie"
|
||||||
"github.com/admpub/sessions"
|
"github.com/admpub/sessions"
|
||||||
"github.com/boltdb/bolt"
|
"github.com/boltdb/bolt"
|
||||||
"github.com/gorilla/securecookie"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var benchmarkDB = fmt.Sprintf("benchmark_store_%d.db", time.Now().Unix())
|
var benchmarkDB = fmt.Sprintf("benchmark_store_%d.db", time.Now().Unix())
|
||||||
|
@ -83,6 +86,8 @@ func TestStore_Get(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
str, err := New(
|
str, err := New(
|
||||||
db,
|
db,
|
||||||
|
@ -93,7 +98,7 @@ func TestStore_Get(t *testing.T) {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
session, err := str.Get(req, "test")
|
session, err := str.Get(ctx, "test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
@ -123,14 +128,15 @@ func TestStore_New(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
|
||||||
|
ctx.SessionOptions().MaxAge = 1024
|
||||||
|
|
||||||
encoded, err := securecookie.EncodeMulti("test", "1", str.codecs...)
|
encoded, err := securecookie.EncodeMulti("test", "1", str.codecs...)
|
||||||
|
|
||||||
req.AddCookie(sessions.NewCookie("test", encoded, &sessions.Options{
|
req.AddCookie(sessions.NewCookie(ctx, "test", encoded))
|
||||||
MaxAge: 1024,
|
|
||||||
}))
|
|
||||||
|
|
||||||
session, err := str.New(req, "test")
|
session, err := str.New(ctx, "test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
@ -141,7 +147,7 @@ func TestStore_New(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStore_Save(t *testing.T) {
|
func TestStore_Save(t *testing.T) {
|
||||||
// When session.Options.MaxAge < 0
|
// When ctx.SessionOptions().MaxAge < 0
|
||||||
db, err := bolt.Open("./sessions.db", 0666, nil)
|
db, err := bolt.Open("./sessions.db", 0666, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
|
@ -161,47 +167,48 @@ func TestStore_Save(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
session, err := str.Get(req, "test")
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
session.Options.MaxAge = -1
|
|
||||||
|
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
if err := str.Save(req, w, session); err != nil {
|
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// When session.Options.MaxAge >= 0
|
session, err := str.Get(ctx, "test")
|
||||||
session, err = str.Get(req, "test")
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
session.Options.MaxAge = 1
|
ctx.SessionOptions().MaxAge = -1
|
||||||
|
|
||||||
|
if err := str.Save(ctx, session); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// When ctx.SessionOptions().MaxAge >= 0
|
||||||
|
session, err = str.Get(ctx, "test")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.SessionOptions().MaxAge = 1
|
||||||
|
|
||||||
w = httptest.NewRecorder()
|
w = httptest.NewRecorder()
|
||||||
|
|
||||||
if err := str.Save(req, w, session); err != nil {
|
if err := str.Save(ctx, session); err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// When session.Options.MaxAge >= 0 and
|
// When ctx.SessionOptions().MaxAge >= 0 and
|
||||||
// s.save returns an error
|
// s.save returns an error
|
||||||
session.Values = make(map[interface{}]interface{})
|
session.Values = make(map[interface{}]interface{})
|
||||||
session.Values[make(chan int)] = make(chan int)
|
session.Values[make(chan int)] = make(chan int)
|
||||||
if err := str.Save(req, w, session); err == nil || err.Error() != "gob: type not registered for interface: chan int" {
|
if err := str.Save(ctx, session); err == nil || err.Error() != "gob: type not registered for interface: chan int" {
|
||||||
t.Errorf(`str.Save should return an error "%s" (actual: %+v)`, "gob: type not registered for interface: chan int", err)
|
t.Errorf(`str.Save should return an error "%s" (actual: %+v)`, "gob: type not registered for interface: chan int", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// When session.Options.MaxAge >= 0 and
|
// When ctx.SessionOptions().MaxAge >= 0 and
|
||||||
// securecookie.EncodeMulti returns an error
|
// securecookie.EncodeMulti returns an error
|
||||||
session.Values = make(map[interface{}]interface{})
|
session.Values = make(map[interface{}]interface{})
|
||||||
str.codecs = nil
|
str.codecs = nil
|
||||||
if err := str.Save(req, w, session); err == nil || err.Error() != "securecookie: no codecs provided" {
|
if err := str.Save(ctx, session); err == nil || err.Error() != "securecookie: no codecs provided" {
|
||||||
t.Errorf(`str.Save should return an error "%s" (actual: %+v)`, "securecookie: no codecs provided", err)
|
t.Errorf(`str.Save should return an error "%s" (actual: %+v)`, "securecookie: no codecs provided", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -227,14 +234,15 @@ func TestStore_load(t *testing.T) {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
session, err := str.Get(req, "test")
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
|
session, err := str.Get(ctx, "test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
w := httptest.NewRecorder()
|
if err := str.Save(ctx, session); err != nil {
|
||||||
|
|
||||||
if err := str.Save(req, w, session); err != nil {
|
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,12 +279,12 @@ func TestStore_load(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// When the target session data is expired
|
// When the target session data is expired
|
||||||
session, err = str.Get(req, "test")
|
session, err = str.Get(ctx, "test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
session.Options.MaxAge = 0
|
ctx.SessionOptions().MaxAge = 0
|
||||||
if err := str.Save(req, w, session); err != nil {
|
if err := str.Save(ctx, session); err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -308,7 +316,10 @@ func TestSession_delete(t *testing.T) {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
session, err := str.Get(req, "test")
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
|
session, err := str.Get(ctx, "test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
@ -318,7 +329,7 @@ func TestSession_delete(t *testing.T) {
|
||||||
err = str.delete(session)
|
err = str.delete(session)
|
||||||
|
|
||||||
if err.Error() != "database not open" {
|
if err.Error() != "database not open" {
|
||||||
t.Error(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
|
t.Errorf(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,7 +347,7 @@ func TestNew(t *testing.T) {
|
||||||
[]byte("secret-key"),
|
[]byte("secret-key"),
|
||||||
)
|
)
|
||||||
if err.Error() != "database not open" {
|
if err.Error() != "database not open" {
|
||||||
t.Error(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
|
t.Errorf(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,9 +363,11 @@ func ExampleStore_Get() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
// Get a session.
|
// Get a session.
|
||||||
session, err := str.Get(r, "session-key")
|
session, err := str.Get(ctx, "session-key")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -375,9 +388,11 @@ func ExampleStore_New() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
// Create a session.
|
// Create a session.
|
||||||
session, err := str.New(r, "session-key")
|
session, err := str.New(ctx, "session-key")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -402,8 +417,10 @@ func ExampleStore_Save() {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
// Create a session.
|
// Create a session.
|
||||||
session, err := str.New(r, "session-key")
|
session, err := str.New(ctx, "session-key")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -412,14 +429,14 @@ func ExampleStore_Save() {
|
||||||
session.Values["foo"] = "bar"
|
session.Values["foo"] = "bar"
|
||||||
|
|
||||||
// Save the session.
|
// Save the session.
|
||||||
if err := sessions.Save(r, w); err != nil {
|
if err := sessions.Save(ctx); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// You can delete the session by setting the session options's MaxAge
|
// You can delete the session by setting the session options's MaxAge
|
||||||
// to a minus value.
|
// to a minus value.
|
||||||
session.Options.MaxAge = -1
|
ctx.SessionOptions().MaxAge = -1
|
||||||
if err := sessions.Save(r, w); err != nil {
|
if err := sessions.Save(ctx); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -436,9 +453,11 @@ func ExampleNew() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
// Get a session.
|
// Get a session.
|
||||||
session, err := str.Get(r, "session-key")
|
session, err := str.Get(ctx, "session-key")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -488,9 +507,11 @@ func BenchmarkStore_Get(b *testing.B) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
_, err := str.Get(req, "test")
|
_, err := str.Get(ctx, "test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
|
@ -518,9 +539,11 @@ func BenchmarkStore_New(b *testing.B) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
_, err := str.New(req, "test")
|
_, err := str.New(ctx, "test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
|
@ -550,8 +573,9 @@ func BenchmarkStore_Save(b *testing.B) {
|
||||||
}
|
}
|
||||||
|
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
session, err := str.Get(req, "test")
|
session, err := str.Get(ctx, "test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
|
@ -559,7 +583,7 @@ func BenchmarkStore_Save(b *testing.B) {
|
||||||
session.Values["foo"] = "bar"
|
session.Values["foo"] = "bar"
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
if err := str.Save(req, w, session); err != nil {
|
if err := str.Save(ctx, session); err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -588,18 +612,19 @@ func BenchmarkStore_Save_delete(b *testing.B) {
|
||||||
}
|
}
|
||||||
|
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
|
||||||
|
|
||||||
session, err := str.Get(req, "test")
|
session, err := str.Get(ctx, "test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
session.Values["foo"] = "bar"
|
session.Values["foo"] = "bar"
|
||||||
|
|
||||||
session.Options.MaxAge = -1
|
ctx.SessionOptions().MaxAge = -1
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
if err := str.Save(req, w, session); err != nil {
|
if err := str.Save(ctx, session); err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue