Сессии в отдельном подпакете
This commit is contained in:
parent
2916082d5e
commit
c261597b9a
3 changed files with 27 additions and 22 deletions
|
@ -4,8 +4,8 @@ type ctxKey int
|
|||
|
||||
const (
|
||||
requestIDKey ctxKey = iota
|
||||
sessionIDKey
|
||||
sessionValueKey
|
||||
sessionConfigKey
|
||||
sessionStorerKey
|
||||
SessionIDKey
|
||||
SessionValueKey
|
||||
SessionConfigKey
|
||||
SessionStorerKey
|
||||
)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
Loading…
Reference in a new issue