cookie.go
func (c *Cookie) ParseBytes(src []byte) error {
	c.Reset()

	var s cookieScanner
	s.b = src

	kv := &c.bufKV
	if !s.next(kv) {
		return errNoCookies
	}

	c.key = append(c.key[:0], kv.key...)
	c.value = append(c.value[:0], kv.value...)

	for s.next(kv) {
		if len(kv.key) != 0 {
			// Case insensitive switch on first char
			switch kv.key[0] | 0x20 {
			case 'm':
				if caseInsensitiveCompare(strCookieMaxAge, kv.key) {
					maxAge, err := ParseUint(kv.value)
					if err != nil {
						return err
					}
					c.maxAge = maxAge
				}

			case 'e': // "expires"
				if caseInsensitiveCompare(strCookieExpires, kv.key) {
					v := b2s(kv.value)
					// Try the same two formats as net/http
					// See: https://github.com/golang/go/blob/00379be17e63a5b75b3237819392d2dc3b313a27/src/net/http/cookie.go#L133-L135
					exptime, err := time.ParseInLocation(time.RFC1123, v, time.UTC)
					if err != nil {
						exptime, err = time.Parse("Mon, 02-Jan-2006 15:04:05 MST", v)
						if err != nil {
							return err
						}
					}
					c.expire = exptime
				}

			case 'd': // "domain"
				if caseInsensitiveCompare(strCookieDomain, kv.key) {
					c.domain = append(c.domain[:0], kv.value...)
				}

			case 'p': // "path"
				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 {
			// Case insensitive switch on first char
			switch kv.value[0] | 0x20 {
			case 'h': // "httponly"
				if caseInsensitiveCompare(strCookieHTTPOnly, kv.value) {
					c.httpOnly = true
				}

			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
	}
	return nil
}
func (c *Cookie) ParseBytes(src []byte) error {
	c.Reset()

	var s cookieScanner
	s.b = src

	kv := &c.bufKV
	if !s.next(kv) {
		return errNoCookies
	}

	c.key = append(c.key[:0], kv.key...)
	c.value = append(c.value[:0], kv.value...)

	for s.next(kv) {
		if len(kv.key) != 0 {
			// Case insensitive switch on first char
			switch kv.key[0] | 0x20 {
			case 'm':
				if caseInsensitiveCompare(strCookieMaxAge, kv.key) {
					maxAge, err := ParseUint(kv.value)
					if err != nil {
						return err
					}
					c.maxAge = maxAge
				}

			case 'e': // "expires"
				if caseInsensitiveCompare(strCookieExpires, kv.key) {
					v := b2s(kv.value)
					// Try the same two formats as net/http
					// See: https://github.com/golang/go/blob/00379be17e63a5b75b3237819392d2dc3b313a27/src/net/http/cookie.go#L133-L135
					exptime, err := time.ParseInLocation(time.RFC1123, v, time.UTC)
					if err != nil {
						exptime, err = time.Parse("Mon, 02-Jan-2006 15:04:05 MST", v)
						if err != nil {
							return err
						}
					}
					c.expire = exptime
				}

			case 'd': // "domain"
				if caseInsensitiveCompare(strCookieDomain, kv.key) {
					c.domain = append(c.domain[:0], kv.value...)
				}

			case 'p': // "path"
				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 {
			// Case insensitive switch on first char
			switch kv.value[0] | 0x20 {
			case 'h': // "httponly"
				if caseInsensitiveCompare(strCookieHTTPOnly, kv.value) {
					c.httpOnly = true
				}

			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
	}
	return nil
}
func ( c * Cookie ) ParseBytes ( src [ ] byte ) error { c . Reset ( ) var s cookieScanner s . b = src kv := & c . bufKV if ! s . next ( kv ) { return errNoCookies } c . key = append ( c . key [ : 0 ] , kv . key ... ) c . value = append ( c . value [ : 0 ] , kv . value ... ) for s . next ( kv ) { if len ( kv . key ) != 0 { // Case insensitive switch on first char switch kv . key [ 0 ] | 0x20 { case 'm' : if caseInsensitiveCompare ( strCookieMaxAge , kv . key ) { maxAge , err := ParseUint ( kv . value ) if err != nil { return err } c . maxAge = maxAge } case 'e' : // "expires" if caseInsensitiveCompare ( strCookieExpires , kv . key ) { v := b2s ( kv . value ) // Try the same two formats as net/http // See: https://github.com/golang/go/blob/00379be17e63a5b75b3237819392d2dc3b313a27/src/net/http/cookie.go#L133-L135 exptime , err := time . ParseInLocation ( time . RFC1123 , v , time . UTC ) if err != nil { exptime , err = time . Parse ( " " , v ) if err != nil { return err } } c . expire = exptime } case 'd' : // "domain" if caseInsensitiveCompare ( strCookieDomain , kv . key ) { c . domain = append ( c . domain [ : 0 ] , kv . value ... ) } case 'p' : // "path" 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 { // Case insensitive switch on first char switch kv . value [ 0 ] | 0x20 { case 'h' : // "httponly" if caseInsensitiveCompare ( strCookieHTTPOnly , kv . value ) { c . httpOnly = true } 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 } return nil }
// ParseBytes parses Set-Cookie header.
ParseBytes parses Set - Cookie header .