mirror of https://github.com/caddyserver/caddy.git
reverseproxy: add Max-Age option to sticky cookie (#6398)
* reverseproxy: add Max-Age option to sticky cookie * Update selectionpolicies.go Co-authored-by: Francis Lavoie <lavofr@gmail.com> * Update selectionpolicies.go Co-authored-by: Francis Lavoie <lavofr@gmail.com> --------- Co-authored-by: Francis Lavoie <lavofr@gmail.com>
This commit is contained in:
parent
aca4002fd8
commit
fab6375a8b
|
@ -26,6 +26,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/cespare/xxhash/v2"
|
"github.com/cespare/xxhash/v2"
|
||||||
|
|
||||||
|
@ -613,6 +614,8 @@ type CookieHashSelection struct {
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
// Secret to hash (Hmac256) chosen upstream in cookie
|
// Secret to hash (Hmac256) chosen upstream in cookie
|
||||||
Secret string `json:"secret,omitempty"`
|
Secret string `json:"secret,omitempty"`
|
||||||
|
// The cookie's Max-Age before it expires. Default is no expiry.
|
||||||
|
MaxAge caddy.Duration `json:"max_age,omitempty"`
|
||||||
|
|
||||||
// The fallback policy to use if the cookie is not present. Defaults to `random`.
|
// The fallback policy to use if the cookie is not present. Defaults to `random`.
|
||||||
FallbackRaw json.RawMessage `json:"fallback,omitempty" caddy:"namespace=http.reverse_proxy.selection_policies inline_key=policy"`
|
FallbackRaw json.RawMessage `json:"fallback,omitempty" caddy:"namespace=http.reverse_proxy.selection_policies inline_key=policy"`
|
||||||
|
@ -671,6 +674,9 @@ func (s CookieHashSelection) Select(pool UpstreamPool, req *http.Request, w http
|
||||||
cookie.Secure = true
|
cookie.Secure = true
|
||||||
cookie.SameSite = http.SameSiteNoneMode
|
cookie.SameSite = http.SameSiteNoneMode
|
||||||
}
|
}
|
||||||
|
if s.MaxAge > 0 {
|
||||||
|
cookie.MaxAge = int(time.Duration(s.MaxAge).Seconds())
|
||||||
|
}
|
||||||
http.SetCookie(w, cookie)
|
http.SetCookie(w, cookie)
|
||||||
return upstream
|
return upstream
|
||||||
}
|
}
|
||||||
|
@ -699,6 +705,7 @@ func (s CookieHashSelection) Select(pool UpstreamPool, req *http.Request, w http
|
||||||
//
|
//
|
||||||
// lb_policy cookie [<name> [<secret>]] {
|
// lb_policy cookie [<name> [<secret>]] {
|
||||||
// fallback <policy>
|
// fallback <policy>
|
||||||
|
// max_age <duration>
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// By default name is `lb`
|
// By default name is `lb`
|
||||||
|
@ -728,6 +735,24 @@ func (s *CookieHashSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
s.FallbackRaw = mod
|
s.FallbackRaw = mod
|
||||||
|
case "max_age":
|
||||||
|
if !d.NextArg() {
|
||||||
|
return d.ArgErr()
|
||||||
|
}
|
||||||
|
if s.MaxAge != 0 {
|
||||||
|
return d.Err("cookie max_age already specified")
|
||||||
|
}
|
||||||
|
maxAge, err := caddy.ParseDuration(d.Val())
|
||||||
|
if err != nil {
|
||||||
|
return d.Errf("invalid duration: %s", d.Val())
|
||||||
|
}
|
||||||
|
if maxAge <= 0 {
|
||||||
|
return d.Errf("invalid duration: %s, max_age should be non-zero and positive", d.Val())
|
||||||
|
}
|
||||||
|
if d.NextArg() {
|
||||||
|
return d.ArgErr()
|
||||||
|
}
|
||||||
|
s.MaxAge = caddy.Duration(maxAge)
|
||||||
default:
|
default:
|
||||||
return d.Errf("unrecognized option '%s'", d.Val())
|
return d.Errf("unrecognized option '%s'", d.Val())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue