57 lines
1008 B
Go
57 lines
1008 B
Go
package session
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/segmentio/ksuid"
|
|
)
|
|
|
|
type MiddlewareOpts func(*Middleware)
|
|
|
|
func NewMiddleware(next http.Handler, opts ...MiddlewareOpts) http.Handler {
|
|
mw := Middleware{
|
|
Next: next,
|
|
Secure: true,
|
|
HTTPOnly: true,
|
|
}
|
|
for _, opt := range opts {
|
|
opt(&mw)
|
|
}
|
|
return mw
|
|
}
|
|
|
|
func WithSecure(secure bool) MiddlewareOpts {
|
|
return func(m *Middleware) {
|
|
m.Secure = secure
|
|
}
|
|
}
|
|
|
|
func WithHTTPOnly(httpOnly bool) MiddlewareOpts {
|
|
return func(m *Middleware) {
|
|
m.HTTPOnly = httpOnly
|
|
}
|
|
}
|
|
|
|
type Middleware struct {
|
|
Next http.Handler
|
|
Secure bool
|
|
HTTPOnly bool
|
|
}
|
|
|
|
func ID(r *http.Request) (id string) {
|
|
cookie, err := r.Cookie("sessionID")
|
|
if err != nil {
|
|
return
|
|
}
|
|
return cookie.Value
|
|
}
|
|
|
|
func (mw Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
id := ID(r)
|
|
if id == "" {
|
|
id = ksuid.New().String()
|
|
http.SetCookie(w, &http.Cookie{Name: "sessionID", Value: id, Secure: mw.Secure, HttpOnly: mw.HTTPOnly})
|
|
}
|
|
mw.Next.ServeHTTP(w, r)
|
|
}
|