我在http库中遇到了Do
函数的奇怪行为。
在我的课程中,我有一名工作人员在阅读频道。在每个消息工作者调用一个发出http请求的函数。这是功能:
func FetchUrlWithProxy(url string, proxy string) (*http.Response, error) {
proxyUrl, err := urllib.Parse(proxy) // [1]
if err != nil {
return nil, err
}
client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
request, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
log.Println("try ", url) // [2]
response, err := client.Do(request)
log.Println("done ", url) // [3]
if err != nil { // [4]
return nil, err
}
return response, nil
}
[1]
- 只是net/url
导入了此名称。[2]
- 此行是eveytime打印的。[3]
- 此行永远不会打印
错误/恐慌。[4]
- 所以检查返回值是没用的。
执行没有达到这一点。这种行为绝对不是我的预期。但是,如果我删除代理使用情况并将client
创建为client := &http.Client{}
,它就可以正常运行。另一方面,代理没有被破坏。我使用curl
检查了它。怎么会这样?
如果您需要,我会提供任何其他信息。
答案 0 :(得分:0)
您的代码似乎有效 - 我怀疑您实际使用的代理程序是否正在发生?
代码:
package main
import (
"log"
"net/http"
urllib "net/url"
)
func FetchUrlWithProxy(url string, proxy string) (*http.Response, error) {
proxyUrl, err := urllib.Parse(proxy) // [1]
if err != nil {
return nil, err
}
client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
request, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
log.Println("try ", url) // [2]
response, err := client.Do(request)
log.Println("done ", url) // [3]
if err != nil { // [4]
return nil, err
}
return response, nil
}
func main() {
res, err := FetchUrlWithProxy("https://www.google.com", "https://www.google.com")
log.Printf("R %v E %v\n", res, err)
}
输出:
➜ go run p.go
2015/07/20 21:44:45 try https://www.google.com
2015/07/20 21:44:46 done https://www.google.com
2015/07/20 21:44:46 <nil> Get https://www.google.com: unexpected EOF