go - 简单 HTTPS 请求 : Golang returns 505, Python 和 Chrome 工作

标签 go https

我正在尝试使用最简单的 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/

相关文章:

android - 连接到 https ://in android 上的 Web 服务

go - 如何在 go/goa 框架中正确弃用 API 端点?

postgresql - 如何使用 go pg CRUD Postgres Point 数据类型

使用 Thin rack ruby​​ 服务器的 SSL 证书/HTTPS 问题

ajax - 混合内容 : Call http content from API from https page

node.js - 如何通过 https 使用私有(private) GitLab 存储库作为带有私有(private) token 的 npm 依赖项

r - 95% 的时间通过 TLS 从 RSclient 连接到 Rserve 失败

go - Conn 在 Go 中随机关闭且没有警告

go - 尝试使用 close(ch) 结束 goroutine 但最终会无限运行

go - 本地图的键是结构时 Marshal/unMarshal 的问题