aboutsummaryrefslogtreecommitdiff
path: root/cookie.go
diff options
context:
space:
mode:
authorGravatar Matt Reyer <winduptoy@users.noreply.github.com> 2018-12-13 10:04:49 -0500
committerGravatar Erik Dubbelboer <erik@dubbelboer.com> 2018-12-13 21:34:49 +0630
commit62dcd6fdcedcced7ed39ae32df8a96dc1e20e644 (patch)
treeb5205c003a7bd72e6f7da774d110dee1e347976f /cookie.go
parentAdded method (*Server).GetOpenConnectionsCount() and option DisableSleepWhenC... (diff)
downloadfasthttp-62dcd6fdcedcced7ed39ae32df8a96dc1e20e644.tar.gz
fasthttp-62dcd6fdcedcced7ed39ae32df8a96dc1e20e644.tar.bz2
fasthttp-62dcd6fdcedcced7ed39ae32df8a96dc1e20e644.zip
Support SameSite cookie attribute (#488)
SameSite cookie attribute implementation.
Diffstat (limited to 'cookie.go')
-rw-r--r--cookie.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/cookie.go b/cookie.go
index d5abef2..1d9861d 100644
--- a/cookie.go
+++ b/cookie.go
@@ -18,6 +18,20 @@ var (
CookieExpireUnlimited = zeroTime
)
+// CookieSameSite is an enum for the mode in which the SameSite flag should be set for the given cookie.
+// See https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00 for details.
+type CookieSameSite int
+const (
+ // CookieSameSiteDisabled removes the SameSite flag
+ CookieSameSiteDisabled CookieSameSite = iota
+ // CookieSameSiteDefaultMode sets the SameSite flag
+ CookieSameSiteDefaultMode
+ // CookieSameSiteLaxMode sets the SameSite flag with the "Lax" parameter
+ CookieSameSiteLaxMode
+ // CookieSameSiteStrictMode sets the SameSite flag with the "Strict" parameter
+ CookieSameSiteStrictMode
+)
+
// AcquireCookie returns an empty Cookie object from the pool.
//
// The returned object may be returned back to the pool with ReleaseCookie.
@@ -58,6 +72,7 @@ type Cookie struct {
httpOnly bool
secure bool
+ sameSite CookieSameSite
bufKV argsKV
buf []byte
@@ -74,6 +89,7 @@ func (c *Cookie) CopyTo(src *Cookie) {
c.path = append(c.path[:0], src.path...)
c.httpOnly = src.httpOnly
c.secure = src.secure
+ c.sameSite = src.sameSite
}
// HTTPOnly returns true if the cookie is http only.
@@ -96,6 +112,16 @@ func (c *Cookie) SetSecure(secure bool) {
c.secure = secure
}
+// SameSite returns the SameSite mode.
+func (c *Cookie) SameSite() CookieSameSite {
+ return c.sameSite
+}
+
+// SetSameSite sets the cookie's SameSite flag to the given value.
+func (c *Cookie) SetSameSite(mode CookieSameSite) {
+ c.sameSite = mode
+}
+
// Path returns cookie path.
func (c *Cookie) Path() []byte {
return c.path
@@ -209,6 +235,7 @@ func (c *Cookie) Reset() {
c.path = c.path[:0]
c.httpOnly = false
c.secure = false
+ c.sameSite = CookieSameSiteDisabled
}
// AppendBytes appends cookie representation to dst and returns
@@ -246,6 +273,21 @@ func (c *Cookie) AppendBytes(dst []byte) []byte {
dst = append(dst, ';', ' ')
dst = append(dst, strCookieSecure...)
}
+ switch c.sameSite {
+ case CookieSameSiteDefaultMode:
+ dst = append(dst, ';', ' ')
+ dst = append(dst, strCookieSameSite...)
+ case CookieSameSiteLaxMode:
+ dst = append(dst, ';', ' ')
+ dst = append(dst, strCookieSameSite...)
+ dst = append(dst, '=')
+ dst = append(dst, strCookieSameSiteLax...)
+ case CookieSameSiteStrictMode:
+ dst = append(dst, ';', ' ')
+ dst = append(dst, strCookieSameSite...)
+ dst = append(dst, '=')
+ dst = append(dst, strCookieSameSiteStrict...)
+ }
return dst
}
@@ -330,6 +372,21 @@ func (c *Cookie) ParseBytes(src []byte) error {
if caseInsensitiveCompare(strCookiePath, kv.key) {
c.path = append(c.path[:0], kv.value...)
}
+
+ case 's': // "samesite"
+ if caseInsensitiveCompare(strCookieSameSite, kv.key) {
+ // Case insensitive switch on first char
+ switch kv.value[0] | 0x20 {
+ case 'l': // "lax"
+ if caseInsensitiveCompare(strCookieSameSiteLax, kv.value) {
+ c.sameSite = CookieSameSiteLaxMode
+ }
+ case 's': // "strict"
+ if caseInsensitiveCompare(strCookieSameSiteStrict, kv.value) {
+ c.sameSite = CookieSameSiteStrictMode
+ }
+ }
+ }
}
} else if len(kv.value) != 0 {
@@ -343,6 +400,8 @@ func (c *Cookie) ParseBytes(src []byte) error {
case 's': // "secure"
if caseInsensitiveCompare(strCookieSecure, kv.value) {
c.secure = true
+ } else if caseInsensitiveCompare(strCookieSameSite, kv.value) {
+ c.sameSite = CookieSameSiteDefaultMode
}
}
} // else empty or no match