简单HTTPS请求:Golang返回505、Python和Chrome工作

简单HTTPS请求:Golang返回505、Python和Chrome工作,go,https,Go,Https,我试图使用最简单的golang代码执行HTTP get-over TLS,并从不支持的服务器HTTP版本获得505响应。问题是,使用一个简单的python requests.get,同样的查询也可以工作。此外,我可以使用Chrome并成功执行相同的请求 您知道是什么原因导致golang请求不同,从而导致服务器返回505吗 我意识到这个响应是特定于服务器的。HTTPS到google.com,使用相同的golang代码工作。我曾尝试使用Wireshark进行故障排除,但TLS使这变得很困难。看来这一

我试图使用最简单的golang代码执行HTTP get-over TLS,并从不支持的服务器HTTP版本获得505响应。问题是,使用一个简单的python requests.get,同样的查询也可以工作。此外,我可以使用Chrome并成功执行相同的请求

您知道是什么原因导致golang请求不同,从而导致服务器返回505吗

我意识到这个响应是特定于服务器的。HTTPS到google.com,使用相同的golang代码工作。我曾尝试使用Wireshark进行故障排除,但TLS使这变得很困难。看来这一定很简单!服务器是nginx1.9.3

戈朗代码:

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)

505是不支持的HTTP版本

您没有在传输上设置HTTP版本,并且

DefaultTransport支持HTTP/2

-

Nginx 1.9.5中引入了对HTTP/2协议的支持

因为您没有指定HTTP/2,所以如果服务器不支持2,我会认为通信将退回到1.1,但是响应中的状态以及任何一方支持的HTTP版本都是可疑的

可以将传输配置为使用HTTP/1.1

或者,不要使用自定义传输:

从net/http文档/来源:

客户端是HTTP客户端。它的零值DefaultClient是一个使用DefaultTransport的可用客户端。。。。DefaultClient是默认客户端,由Get、Head和Post使用


我通过解密Wireshark中的流量最终解决了这个问题。my Go实现中的URL包含空格,并使用http。Get没有将空格URL编码为%20。GET请求中有空格,服务器误解了请求


经验教训:Go的http.Get不使用URL编码字符,您必须自己进行编码。

使用最简单的golang代码。。。您是否尝试过resp,err:=http.Gethttps://non-public-address/page?I 没有意识到可以使用DefaultTransport,但遗憾的是,这也会产生一个使用HTTP/1.1的505,而不是使用自定义传输。Get使用http.DefaultClient,后者反过来使用http.DefaultTransport请参见此处:;使用http.Client需要传输。问题是在不理解的情况下使用定制的传输。Adrian的观点很好。我更新了我的答案,试图让它更清楚。当使用DefaultTransport时,我得到了相同的505。打印resp.Request.Proto我可以验证请求是否使用HTTP/1.1。检查python请求响应http version r.raw.version时显示“11”表示http/1.1。python客户端和golang客户端似乎都在使用HTTP/1.1。给出了什么?啊,你在问题中共享的URL不需要编码。我很高兴你找到了答案。您可以使用该包对URL进行编码。
resp, err := http.Get("https://non-public-address/page")