我有一个Web服务器,它在响应中发出 ETag 标头,并检查客户端的 If-None-Match 标头(如果存在) . 在这种情况下,客户端不是Web浏览器,而是go的内置 net/http http.Client 类型的扩展 .
这是我的代码
package util
import "net/http"
import "net/url"
type HttpClient struct {
http.Client
etags map[url.URL]string
}
func (hc *HttpClient) Do(req *http.Request) (*http.Response, error) {
const ETAG_SERVER_HEADER = "ETag"
const ETAG_CLIENT_HEADER = "If-None-Match"
//Do not attempt to use ETags on non-GET requests
if req.Method != "GET" {
return hc.Client.Do(req)
}
//Check for an existing etag
etag, ok := hc.etags[*req.URL]
if ok { //If an ETag is present, send it along
if req.Header == nil {
req.Header = http.Header{}
}
req.Header.Add(ETAG_CLIENT_HEADER, etag)
}
//Do the response
response, err := hc.Client.Do(req)
//If the response is ok
if err == nil {
if hc.etags == nil {
hc.etags = make(map[url.URL]string)
}
//Check for an ETAG from the server, store it if present
etag = response.Header.Get(ETAG_SERVER_HEADER)
if len(etag) != 0 {
hc.etags[*req.URL] = etag
}
}
return response, err
}
它目前没有问题 .
我只是为 GET 请求存储和发送ETag . 虽然将它们发送给其他请求是有效的,但它不是我当前的用例,所以我不打扰它 . 通过将 url.URL 对象映射到字符串来存储ETag .
我的问题是这个 . 我要求“/bar.html” . 服务器使用 302 Found 和 Location 标头将我重定向到“/qux.html ". I then request " /qux.html”并获得 200 OK 以及 ETag 标头 .
使用什么URL关联上一个响应中的 ETag 标头?
302 Found 本身可以包含一个 ETag Headers 吗?