diff --git a/cookie.go b/cookie.go index 8137643c24..6faa8c0360 100644 --- a/cookie.go +++ b/cookie.go @@ -31,6 +31,8 @@ const ( CookieSameSiteLaxMode // CookieSameSiteStrictMode sets the SameSite flag with the "Strict" parameter CookieSameSiteStrictMode + // CookieSameSiteStrictMode sets the SameSite flag with the "None" parameter + CookieSameSiteNoneMode ) // AcquireCookie returns an empty Cookie object from the pool. @@ -288,6 +290,11 @@ func (c *Cookie) AppendBytes(dst []byte) []byte { dst = append(dst, strCookieSameSite...) dst = append(dst, '=') dst = append(dst, strCookieSameSiteStrict...) + case CookieSameSiteNoneMode: + dst = append(dst, ';', ' ') + dst = append(dst, strCookieSameSite...) + dst = append(dst, '=') + dst = append(dst, strCookieSameSiteNone...) } return dst } @@ -386,6 +393,10 @@ func (c *Cookie) ParseBytes(src []byte) error { if caseInsensitiveCompare(strCookieSameSiteStrict, kv.value) { c.sameSite = CookieSameSiteStrictMode } + case 'n': // "none" + if caseInsensitiveCompare(strCookieSameSiteNone, kv.value) { + c.sameSite = CookieSameSiteNoneMode + } } } } diff --git a/cookie_test.go b/cookie_test.go index 50c2ad3463..ae8b4fd750 100644 --- a/cookie_test.go +++ b/cookie_test.go @@ -121,6 +121,17 @@ func TestCookieSameSite(t *testing.T) { t.Fatalf("missing SameSite flag in cookie %q", s) } + if err := c.Parse("foo=bar; samesite=none"); err != nil { + t.Fatalf("unexpected error: %s", err) + } + if c.SameSite() != CookieSameSiteNoneMode { + t.Fatalf("SameSite None Mode must be set") + } + s = c.String() + if !strings.Contains(s, "; SameSite=None") { + t.Fatalf("missing SameSite flag in cookie %q", s) + } + if err := c.Parse("foo=bar"); err != nil { t.Fatalf("unexpected error: %s", err) } diff --git a/strings.go b/strings.go index 6fef4ead73..f654f958a0 100644 --- a/strings.go +++ b/strings.go @@ -62,6 +62,7 @@ var ( strCookieSameSite = []byte("SameSite") strCookieSameSiteLax = []byte("Lax") strCookieSameSiteStrict = []byte("Strict") + strCookieSameSiteNone = []byte("None") strClose = []byte("close") strGzip = []byte("gzip")