From c261597b9adb827bfa16de8f21ce47ac63bec138 Mon Sep 17 00:00:00 2001 From: Alexander NeonXP Kiryukhin Date: Mon, 29 Jul 2024 02:46:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B5=D1=81=D1=81=D0=B8=D0=B8=20=D0=B2?= =?UTF-8?q?=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- middleware/context.go | 8 +++--- middleware/session/bbolt.go | 2 +- middleware/{ => session}/session.go | 39 ++++++++++++++++------------- 3 files changed, 27 insertions(+), 22 deletions(-) rename middleware/{ => session}/session.go (59%) diff --git a/middleware/context.go b/middleware/context.go index b9ad45f..a76bca0 100644 --- a/middleware/context.go +++ b/middleware/context.go @@ -4,8 +4,8 @@ type ctxKey int const ( requestIDKey ctxKey = iota - sessionIDKey - sessionValueKey - sessionConfigKey - sessionStorerKey + SessionIDKey + SessionValueKey + SessionConfigKey + SessionStorerKey ) diff --git a/middleware/session/bbolt.go b/middleware/session/bbolt.go index 1068ed8..be484d7 100644 --- a/middleware/session/bbolt.go +++ b/middleware/session/bbolt.go @@ -9,7 +9,7 @@ import ( "go.etcd.io/bbolt" ) -func New(db *bbolt.DB, bucketName []byte) Store { +func NewBoltStore(db *bbolt.DB, bucketName []byte) Store { return &BoltStore{ db: db, bucketName: bucketName, diff --git a/middleware/session.go b/middleware/session/session.go similarity index 59% rename from middleware/session.go rename to middleware/session/session.go index 838e088..4d02bf1 100644 --- a/middleware/session.go +++ b/middleware/session/session.go @@ -1,16 +1,17 @@ -package middleware +package session import ( "context" "errors" "net/http" + "sync" "go.neonxp.ru/mux" - "go.neonxp.ru/mux/middleware/session" + "go.neonxp.ru/mux/middleware" "go.neonxp.ru/objectid" ) -type SessionConfig struct { +type Config struct { SessionCookie string Path string Domain string @@ -19,7 +20,7 @@ type SessionConfig struct { MaxAge int } -var DefaultSessionConfig SessionConfig = SessionConfig{ +var DefaultConfig Config = Config{ SessionCookie: "_session", Path: "/", Domain: "", @@ -28,12 +29,16 @@ var DefaultSessionConfig SessionConfig = SessionConfig{ MaxAge: 30 * 3600, } -func Session(config SessionConfig, storer session.Store) mux.Middleware { +func Middleware(config Config, storer Store) mux.Middleware { + if storer == nil { + storer = &MemoryStore{store: sync.Map{}} + } + return func(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var ( sessionID string - values session.Value + values Value ) cookie, err := r.Cookie(config.SessionCookie) switch { @@ -42,7 +47,7 @@ func Session(config SessionConfig, storer session.Store) mux.Middleware { values = storer.Load(r.Context(), sessionID) case errors.Is(err, http.ErrNoCookie): sessionID = objectid.New().String() - values = session.Value{} + values = Value{} } http.SetCookie(w, &http.Cookie{ @@ -55,10 +60,10 @@ func Session(config SessionConfig, storer session.Store) mux.Middleware { MaxAge: config.MaxAge, }) - ctx := context.WithValue(r.Context(), sessionValueKey, &values) - ctx = context.WithValue(ctx, sessionIDKey, sessionID) - ctx = context.WithValue(ctx, sessionConfigKey, config) - ctx = context.WithValue(ctx, sessionStorerKey, storer) + ctx := context.WithValue(r.Context(), middleware.SessionValueKey, &values) + ctx = context.WithValue(ctx, middleware.SessionIDKey, sessionID) + ctx = context.WithValue(ctx, middleware.SessionConfigKey, config) + ctx = context.WithValue(ctx, middleware.SessionStorerKey, storer) h.ServeHTTP(w, r.WithContext(ctx)) @@ -68,15 +73,15 @@ func Session(config SessionConfig, storer session.Store) mux.Middleware { } } -func SessionFromRequest(r *http.Request) *session.Value { - return r.Context().Value(sessionValueKey).(*session.Value) +func FromRequest(r *http.Request) *Value { + return r.Context().Value(middleware.SessionValueKey).(*Value) } -func ClearSession(w http.ResponseWriter, r *http.Request) { - storer := r.Context().Value(sessionStorerKey).(session.Store) - sessionID := r.Context().Value(sessionIDKey).(string) +func Clear(w http.ResponseWriter, r *http.Request) { + storer := r.Context().Value(middleware.SessionStorerKey).(Store) + sessionID := r.Context().Value(middleware.SessionIDKey).(string) storer.Remove(r.Context(), sessionID) - config := r.Context().Value(sessionConfigKey).(SessionConfig) + config := r.Context().Value(middleware.SessionConfigKey).(Config) http.SetCookie(w, &http.Cookie{ Name: config.SessionCookie, Value: sessionID,