http.Client.Do会停止执行而不会出现任何错误

时间:2015-07-20 08:37:02

标签: http go proxy

我在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检查了它。怎么会这样?

如果您需要,我会提供任何其他信息。

1 个答案:

答案 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