我正在尝试使用最简单的可想象的golang代码通过TLS执行HTTP获取,并从服务器获取505响应(不支持HTTP版本)。事实是,使用简单的python request.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)
答案 0 :(得分:2)
505不支持HTTP版本。
您没有在Transport
上设置HTTP版本,并且
DefaultTransport支持HTTP / 2。
在Nginx 1.9.5中引入了对HTTP / 2协议的支持。
由于您未指定HTTP / 2,因此我认为如果服务器不支持2,则通信将回落到1.1,但是响应状态和任一侧支持的HTTP版本都是可疑的。
可以将 Transport
配置为使用HTTP / 1.1。
或者,不要使用自定义的Transport
:
resp, err := http.Get("https://non-public-address/page")
来自net/http
文档/源:
客户端是HTTP客户端。其零值(DefaultClient)是使用DefaultTransport的可用客户端。...DefaultClient是默认客户端,并由Get,Head和Post使用。
答案 1 :(得分:0)
我最终通过在Wireshark中解密流量来解决了这个问题。我的Go实施中的URL带有空格,并且使用http.Get没有将空格编码为%20。 GET请求中有空格,服务器误解了请求。
经验教训:Go的http.Get不会对字符进行URL编码,因此您必须自己执行此操作。