所以..我有这个单元测试:
func TestCookieVoodoo(t *testing.T) {
req := httptest.NewRequest("GET", "/", nil)
cookie := http.Cookie{Name: "potato", MaxAge: 1000}
req.AddCookie(&cookie)
cookieCopy, _ := req.Cookie("potato")
println(fmt.Sprintf("Cookie orig: %v", cookie))
println(fmt.Sprintf("Cookie Copy: %v", *cookieCopy))
t.Fail()
}
运行时,输出为:
Cookie orig: {potato 0001-01-01 00:00:00 +0000 UTC 1000 false false 0 []}
Cookie copy: {potato 0001-01-01 00:00:00 +0000 UTC 0 false false 0 []}
为什么会失去最大年龄? (设置其他Cookie字段时也会发生同样的情况)
答案 0 :(得分:6)
因为key
仅将value
和func (r *Request) AddCookie(c *Cookie) {
s := fmt.Sprintf("%s=%s", sanitizeCookieName(c.Name), sanitizeCookieValue(c.Value))
if c := r.Header.Get("Cookie"); c != "" {
r.Header.Set("Cookie", c+"; "+s)
} else {
r.Header.Set("Cookie", s)
}
}
添加到cookie字符串中。功能是:
cookie-string
为什么?
RFC 6265
中Max-Age
的定义key=value
和其他字段由客户端而非服务器使用。他们是客户端的配置。例如:如果cookie到期,则客户端不会将ecosystem.config.js
发送到服务器。因此,请求 答案 1 :(得分:3)
如果您查看AddCookie
代码,您会发现它以Cookie
的形式将<Name>=<Value>
标头附加到请求,或附加到现有的Cookie
标头而忽略Cookie结构的所有其他字段(名称和值除外)。
Cookie标头仅包含Name
和Value
的概念,有关Cookie
标头的更多信息可以在here中找到。
另一方面,Set-Cookie
标头将保留Cookie结构的所有字段,但这通常会在HTTP响应上进行设置。因此,将其设置在您的http.Request
上并没有任何意义。
答案 2 :(得分:1)
在AddCookie
的Go实现中,它仅使用Name
和Value
字段。
我认为这是因为MaxAge
在Response
中发送cookie时有效,而在制作Request
时则无关紧要。客户收到的随请求一起提交的任何Cookie(与您的情况相同)都应经过验证;然后,有效的Cookie会与AddCookie
添加在一起,并且只有它们的键和值会与请求一起提交。