Golang native http 客户端卡在特定 URI 上

标签 go https

这是一小段代码:

//resp, err := http.Get("https://alfabank.ru")
resp, err := http.Get("https://google.com")
if err != nil {
    log.Fatalln(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    log.Fatalln(err)
}
fmt.Println(string(body))

它在 Google 上运行良好,但在 alfabank 上挂起(尝试取消注释第一行并注释第二行)。 我不知道这个问题出在哪一边:( 但是,例如,

curl https://alfabank.ru

工作正常。

所以,我认为问题出在 Golang 客户端。

我尝试使用 tcpdump 并看到我的计算机和远程服务器之间的无限流量。

你能帮我解决这个问题吗?

更新:遵循评论中的建议

好的,curl 发送此 header :

> GET / HTTP/1.1
> Host: alfabank.ru
> User-Agent: curl/7.54.0
> Accept: */*

所以,我尝试了

req, err := http.NewRequest(http.MethodGet, "http://alfabank.ru", nil)
if err != nil {
    log.Fatalln(err)
}
req.Header.Add("Accept", "*/*")
req.Header.Add("User-Agent", "curl/7.54.0")

client := http.Client{}
resp, err := client.Do(req)

这并不能解决问题。

最佳答案

解决方案:

感谢JimB ,http2协议(protocol)的问题。

因此,禁用 http2 可以帮助我解决问题:

http.DefaultClient.Transport = &http.Transport{
    TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper),
}

关于Golang native http 客户端卡在特定 URI 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46836534/

相关文章:

postgresql - Postgres 返回 []uint8 而不是 []integer

json - 将 time.Date 分配给 *time.Time 指针以测试 JSON 反序列化

java - POST 请求的安全性

Laravel强制www和HTTPS错误: redirect to index. php

arrays - 从两个数组/slice 中获取交集和排除项的最有效方法是什么?

arrays - 去模板绑定(bind)常量数组值

java - Servlet 可以获取 HTTPS session ID 吗?

linux - 将除一个子域以外的所有子域都重定向到 https?

javascript - 不使用 https 能否安全地将信息发送到服务器?

go - 如何反序列化 Kubernetes YAML 文件