aboutsummaryrefslogtreecommitdiff
path: root/cookie.go
diff options
context:
space:
mode:
authorGravatar Aliaksandr Valialkin <valyala@gmail.com> 2016-07-18 18:22:57 +0300
committerGravatar Aliaksandr Valialkin <valyala@gmail.com> 2016-07-18 18:25:03 +0300
commit45697fe30a130ec6a54426a069c82f3abe76b63d (patch)
tree753aea300950944b47ab9357fe441284c5a85737 /cookie.go
parentadd missing http status codes (#140) (diff)
downloadfasthttp-45697fe30a130ec6a54426a069c82f3abe76b63d.tar.gz
fasthttp-45697fe30a130ec6a54426a069c82f3abe76b63d.tar.bz2
fasthttp-45697fe30a130ec6a54426a069c82f3abe76b63d.zip
Issue #141: do not urlencode cookies
https://tools.ietf.org/html/rfc6265 says nothing about cookies encoding.
Diffstat (limited to 'cookie.go')
-rw-r--r--cookie.go34
1 files changed, 18 insertions, 16 deletions
diff --git a/cookie.go b/cookie.go
index af88211..17ecc62 100644
--- a/cookie.go
+++ b/cookie.go
@@ -198,10 +198,10 @@ func (c *Cookie) Reset() {
// the extended dst.
func (c *Cookie) AppendBytes(dst []byte) []byte {
if len(c.key) > 0 {
- dst = AppendQuotedArg(dst, c.key)
+ dst = append(dst, c.key...)
dst = append(dst, '=')
}
- dst = AppendQuotedArg(dst, c.value)
+ dst = append(dst, c.value...)
if !c.expire.IsZero() {
c.bufKV.value = AppendHTTPDate(c.bufKV.value[:0], c.expire)
@@ -264,14 +264,14 @@ func (c *Cookie) ParseBytes(src []byte) error {
s.b = src
kv := &c.bufKV
- if !s.next(kv, true) {
+ 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, false) {
+ for s.next(kv) {
if len(kv.key) == 0 && len(kv.value) == 0 {
continue
}
@@ -311,17 +311,17 @@ func getCookieKey(dst, src []byte) []byte {
if n >= 0 {
src = src[:n]
}
- return decodeCookieArg(dst, src, true)
+ return decodeCookieArg(dst, src, false)
}
func appendRequestCookieBytes(dst []byte, cookies []argsKV) []byte {
for i, n := 0, len(cookies); i < n; i++ {
kv := &cookies[i]
if len(kv.key) > 0 {
- dst = AppendQuotedArg(dst, kv.key)
+ dst = append(dst, kv.key...)
dst = append(dst, '=')
}
- dst = AppendQuotedArg(dst, kv.value)
+ dst = append(dst, kv.value...)
if i+1 < n {
dst = append(dst, ';', ' ')
}
@@ -334,7 +334,7 @@ func parseRequestCookies(cookies []argsKV, src []byte) []argsKV {
s.b = src
var kv *argsKV
cookies, kv = allocArg(cookies)
- for s.next(kv, true) {
+ for s.next(kv) {
if len(kv.key) > 0 || len(kv.value) > 0 {
cookies, kv = allocArg(cookies)
}
@@ -346,7 +346,7 @@ type cookieScanner struct {
b []byte
}
-func (s *cookieScanner) next(kv *argsKV, decode bool) bool {
+func (s *cookieScanner) next(kv *argsKV) bool {
b := s.b
if len(b) == 0 {
return false
@@ -359,14 +359,14 @@ func (s *cookieScanner) next(kv *argsKV, decode bool) bool {
case '=':
if isKey {
isKey = false
- kv.key = decodeCookieArg(kv.key, b[:i], decode)
+ kv.key = decodeCookieArg(kv.key, b[:i], false)
k = i + 1
}
case ';':
if isKey {
kv.key = kv.key[:0]
}
- kv.value = decodeCookieArg(kv.value, b[k:i], decode)
+ kv.value = decodeCookieArg(kv.value, b[k:i], true)
s.b = b[i+1:]
return true
}
@@ -375,20 +375,22 @@ func (s *cookieScanner) next(kv *argsKV, decode bool) bool {
if isKey {
kv.key = kv.key[:0]
}
- kv.value = decodeCookieArg(kv.value, b[k:], decode)
+ kv.value = decodeCookieArg(kv.value, b[k:], true)
s.b = b[len(b):]
return true
}
-func decodeCookieArg(dst, src []byte, decode bool) []byte {
+func decodeCookieArg(dst, src []byte, skipQuotes bool) []byte {
for len(src) > 0 && src[0] == ' ' {
src = src[1:]
}
for len(src) > 0 && src[len(src)-1] == ' ' {
src = src[:len(src)-1]
}
- if !decode {
- return append(dst[:0], src...)
+ if skipQuotes {
+ if len(src) > 1 && src[0] == '"' && src[len(src)-1] == '"' {
+ src = src[1 : len(src)-1]
+ }
}
- return decodeArg(dst, src, true)
+ return append(dst[:0], src...)
}