1 回答
TA贡献1770条经验 获得超3个赞
已经有一个用于检查重定向的钩子,Client.CheckRedirect.
您可以提供回调来执行您想要的操作。
如果你真的想创建你自己的传输来扩展其他功能,你需要提供一个CancelRequest像错误所说的方法来处理Client.Timeout。
func (t *TransportWrapper) CancelRequest(req *Request) {
t.Transport.CancelRequest(req)
}
更常见的是,您会嵌入Transport, 以便自动提升所有方法和字段。但是,您应该避免在传输中使用可写字段,因为预计并发使用是安全的,否则您应该使用互斥锁保护所有访问,或者您必须确保它只在一个 goroutine 中使用。
一个最小的例子看起来像:
type TransportWrapper struct {
*http.Transport
RedirectUrls []Redirect
}
func (t *TransportWrapper) RoundTrip(req *http.Request) (*http.Response, error) {
transport := t.Transport
if transport == nil {
transport = http.DefaultTransport.(*http.Transport)
}
resp, err := transport.RoundTrip(req)
if err != nil {
return resp, err
}
// Remember redirects
if resp.StatusCode >= 300 && resp.StatusCode <= 399 {
fmt.Println("redirected")
t.RedirectUrls = append(
t.RedirectUrls, Redirect{resp.StatusCode, req.URL.String()},
)
}
return resp, err
}
然后您可以在客户端使用超时:
client := &http.Client{
Transport: &TransportWrapper{
Transport: http.DefaultTransport.(*http.Transport),
},
Timeout: 5 * time.Second,
}
- 1 回答
- 0 关注
- 149 浏览
添加回答
举报