golang 的 http 请求, transport.CancelRequest 与 client.Timeout 有冲突
資深大佬 : howellz 3
两个需求:
- 用户可以随时终止请求。
- 用户可以修改超时值,比如 20s ;
对于第一个需求,设置了 client.Transport,并在合适的位置调用其 CancelRequest()接口; 对于第二个需求,设置了 client.Timeout ;
但是调试中发现,如果设置了 client.Timeout,则 Transport.CancelRequest()就不再起效。 注释掉 Timeout 就可以生效。
代码如下:
package main import ( "fmt" "net/http" "time" ) func main() { trans := &http.Transport{} client := &http.Client{ Transport: trans, Timeout: time.Second * (30), // 这一行不注释就无法 CancelRequest } req, err := http.NewRequest("GET", "https://www.google.com", nil) if err != nil { panic(err) } go func() { time.Sleep(time.Second * time.Duration(1)) fmt.Printf("%v: abortn", time.Now()) trans.CancelRequest(req) }() fmt.Printf("%v: start ...n", time.Now()) _, err = client.Do(req) fmt.Printf("%v: donen", time.Now()) if err != nil { fmt.Println(err.Error()) } }
请问我该怎么办?
大佬有話說 (4)