我有一个通过 Rest 查询服务的 Go 命令。 到目前为止,我使用 http 并且没有任何问题,但是一旦我转移到 https,我就会收到一个奇怪的错误,我不知道如何处理。
这是我创建客户端的功能:
func getClient(url string, timeout time.Duration) *http.Client {
const ConnectMaxWaitTime = 10 * time.Minute
if strings.HasPrefix(url, "https") {
cert := getCert()
logHandler("protocol is https, got cert", "DEBUG")
client := &http.Client{
Timeout: timeout,
Transport: &http.Transport{
DialContext: (&net.Dialer{
Timeout: ConnectMaxWaitTime,
}).DialContext,
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
VerifyPeerCertificate: VerifyPeerCertificateAlt,
RootCAs: cert,
},
},
}
return client
} else {
client := &http.Client{
Timeout: timeout,
Transport: &http.Transport{
DialContext: (&net.Dialer{
Timeout: ConnectMaxWaitTime,
}).DialContext,
},
}
return client
}
}
您可以在上面看到两种方式 - https 和 http。 我有两种类型的错误,通常出现在流输出的末尾(这会缩短)。要么是
格式错误的分块编码
或
tls:收到版本 967d 的记录,而期望版本 303
我做错了什么/Https 客户端中缺少什么导致了此问题? 值得一提的是,它只发生在大输出和远程服务器上。我想了解可能是什么问题,即使问题不在我的客户端。
malformed chunked encoding
可能与未正确关闭上一个请求有关。
tls: received record with version 967d when expecting version 303
表示您需要将 TLSHandshakeTimeout
添加到 *http.Transport
。
这是一个基于您上面发布的内容的小示例:
client := &http.Client{ Timeout: timeout, Transport: &http.Transport{ DialContext: (&net.Dialer{ Timeout: ConnectMaxWaitTime, }).DialContext, TLSHandshakeTimeout: 60 * time.Second TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, VerifyPeerCertificate: VerifyPeerCertificateAlt, RootCAs: cert, }, }, }