3 回答
TA贡献2051条经验 获得超10个赞
如果您想要原始标头,则需要编写一些包装器,以便在库net.Conn
解释原始标头之前为其捕获原始标头http
。
但是您似乎并不真的需要原始标头——甚至根本不需要完整标头。如果您的目标只是读取多个 cookie,那么最简单的方法是使用Cookies
响应中的方法。
这两者之间的一个中间选项是读取Header
响应的整个字段。这将显示完整的标头,但不能保证其顺序,并且将进行最少的解析(删除换行符等),因此不能说这是真正的“原始”。但是,它确实通过将所有标头值存储在一个[]string
. 因此,就这个问题而言,这应该是完全足够的(尽管Response.Cookies
如上所述,会更容易)。
TA贡献1843条经验 获得超7个赞
在我看来,往返响应的最佳选择是 httputil#DumpResponse:
package raw
import (
"bufio"
"bytes"
"net/http"
"net/http/httputil"
)
func encode(res *http.Response) ([]byte, error) {
return httputil.DumpResponse(res, false)
}
func decode(data []byte) (*http.Response, error) {
return http.ReadResponse(bufio.NewReader(bytes.NewReader(data)), nil)
}
或者,如果您只想要 cookie,您可以这样做:
package raw
import (
"encoding/json"
"net/http"
)
func encode(res *http.Response) ([]byte, error) {
return json.Marshal(res.Cookies())
}
func decode(data []byte) ([]http.Cookie, error) {
var c []http.Cookie
if e := json.Unmarshal(data, &c); e != nil {
return nil, e
}
return c, nil
}
或者对于单个 cookie:
package raw
import (
"encoding/json"
"net/http"
)
func encode(res *http.Response, name string) ([]byte, error) {
for _, c := range res.Cookies() {
if c.Name == name {
return json.Marshal(c)
}
}
return nil, http.ErrNoCookie
}
func decode(data []byte) (*http.Cookie, error) {
c := new(http.Cookie)
if e := json.Unmarshal(data, c); e != nil {
return nil, e
}
return c, nil
}
https://golang.org/pkg/net/http/httputil#DumpResponse
- 3 回答
- 0 关注
- 205 浏览
添加回答
举报