简单的HTTPS请求:Golang返回505,Python和Chrome运行正常

时间:2018-09-21 01:40:00

标签: go https

我正在尝试使用最简单的可想象的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)

2 个答案:

答案 0 :(得分:2)

505不支持HTTP版本。

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

  

DefaultTransport支持HTTP / 2。

-Go net/http package docs

在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编码,因此您必须自己执行此操作。