我正在尝试使用最简单的 golang 代码执行 HTTP get over TLS,并从服务器获取 505 响应(不支持 HTTP 版本)。问题是,使用简单的 python requests.get 可以实现相同的查询。此外,我可以使用 Chrome 并成功执行相同的请求。
有什么想法会使 golang 请求不同,从而导致服务器返回 505 吗?
我意识到这个响应是特定于服务器的。使用相同的 golang 代码将 HTTPS 连接到 google.com。我曾尝试使用 Wireshark 进行故障排除,但 TLS 使这变得困难。看来这一定很简单!服务器是nginx 1.9.3。
Golang 代码:
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
url := "https://non-public-address/page"
tr := &http.Transport{
MaxIdleConns: 10,
IdleConnTimeout: 30 * time.Second,
DisableCompression: false,
}
client := &http.Client{Transport: tr}
resp, _ := client.Get(url)
fmt.Println(resp)
}
python :
r = requests.get("https://non-public-address/page")
print(r)
最佳答案
我最终通过解密 Wireshark 中的流量解决了这个问题。我的 Go 实现中的 URL 有空格并且使用 http.Get 没有 URL 将空格编码为 %20。 GET 请求中有空格,服务器误解了请求。
经验教训:Go 的 http.Get 不会对字符进行 URL 编码,您必须自己完成此操作。
关于go - 简单 HTTPS 请求 : Golang returns 505, Python 和 Chrome 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52435460/