Cookie sets a cookie by passing a cookie struct.
(cookie *Cookie)
| 251 | |
| 252 | // Cookie sets a cookie by passing a cookie struct. |
| 253 | func (r *DefaultRes) Cookie(cookie *Cookie) { |
| 254 | if cookie.Path == "" { |
| 255 | cookie.Path = "/" |
| 256 | } |
| 257 | |
| 258 | if cookie.SessionOnly { |
| 259 | cookie.MaxAge = 0 |
| 260 | cookie.Expires = time.Time{} |
| 261 | } |
| 262 | |
| 263 | var sameSite http.SameSite |
| 264 | |
| 265 | switch { |
| 266 | case utils.EqualFold(cookie.SameSite, CookieSameSiteStrictMode): |
| 267 | sameSite = http.SameSiteStrictMode |
| 268 | case utils.EqualFold(cookie.SameSite, CookieSameSiteNoneMode): |
| 269 | sameSite = http.SameSiteNoneMode |
| 270 | // SameSite=None requires Secure=true per RFC and browser requirements |
| 271 | cookie.Secure = true |
| 272 | case utils.EqualFold(cookie.SameSite, CookieSameSiteDisabled): |
| 273 | sameSite = 0 |
| 274 | case utils.EqualFold(cookie.SameSite, CookieSameSiteLaxMode): |
| 275 | sameSite = http.SameSiteLaxMode |
| 276 | default: |
| 277 | sameSite = http.SameSiteLaxMode |
| 278 | } |
| 279 | |
| 280 | // Partitioned requires Secure=true per CHIPS spec |
| 281 | if cookie.Partitioned { |
| 282 | cookie.Secure = true |
| 283 | } |
| 284 | |
| 285 | // create/validate cookie using net/http |
| 286 | hc := &http.Cookie{ //nolint:gosec // G124: http.Cookie missing or has insecure Secure, HttpOnly, or SameSite attribute |
| 287 | Name: cookie.Name, |
| 288 | Value: cookie.Value, |
| 289 | Path: cookie.Path, |
| 290 | Domain: cookie.Domain, |
| 291 | Expires: cookie.Expires, |
| 292 | MaxAge: cookie.MaxAge, |
| 293 | Secure: cookie.Secure, |
| 294 | HttpOnly: cookie.HTTPOnly, |
| 295 | SameSite: sameSite, |
| 296 | Partitioned: cookie.Partitioned, |
| 297 | } |
| 298 | |
| 299 | if err := hc.Valid(); err != nil { |
| 300 | // invalid cookies are ignored, same approach as net/http |
| 301 | return |
| 302 | } |
| 303 | |
| 304 | // create fasthttp cookie |
| 305 | fcookie := fasthttp.AcquireCookie() |
| 306 | fcookie.SetKey(hc.Name) |
| 307 | fcookie.SetValue(hc.Value) |
| 308 | fcookie.SetPath(hc.Path) |
| 309 | fcookie.SetDomain(hc.Domain) |
| 310 |