登录
首页 >  Golang >  Go问答

如何调整 Go 的 http 客户端(或传输)来模仿 curls --http2-prior-knowledge 标志?

来源:stackoverflow

时间:2024-04-30 14:57:34 248浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《如何调整 Go 的 http 客户端(或传输)来模仿 curls --http2-prior-knowledge 标志?》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

我正在与服务器交互(超出我的控制范围),如果请求包含内容(post、put、带有有效负载的 patch),则服务器不会执行协议升级。目前还不清楚服务器到底出了什么问题,但我注意到当我使用 --http2-prior-knowledge 查询时,协议已升级:

❯ curl -i -put --http2-prior-knowledge  http://localhost:8081/document/v1/foo -d '{"fields": {"docid": "123"}}'
http/2 200 
date: tue, 08 nov 2022 13:26:50 gmt
content-type: application/json;charset=utf-8
vary: accept-encoding
content-length: 78

没有 --http2-prior-knowledge 的相同请求卡在 http/1.1。这看起来更接近 go 的 http 客户端的默认行为

❯ curl -i -PUT --http2 http://localhost:8081/document/v1/foo -d '{"fields": {"docid": "123"}}'
HTTP/1.1 200 OK
Date: Tue, 08 Nov 2022 01:37:17 GMT
Content-Type: application/json;charset=utf-8
Vary: Accept-Encoding
Content-Length: 78

当我使用 go 的默认客户端调用相同的 api 时,协议不会升级。我尝试在传输上设置 forceattempthttp2: true ,但每个 http.response 都包含 http/1.1.proto

我认为我需要理解的是如何在go中模仿curl的先验知识标志。这可能吗?


正确答案


我通过指定跳过 tls 拨号的自定义 http2.transport 解决了此问题。回想起来,理想的解决方案是使用 ssl 证书(自签名就足够了),这样可以更好地保证 http2 的使用。为后人留下一些链接

c := &http.Client{
        // Skip TLS Dial
        Transport: &http2.Transport{
           AllowHTTP: true,
           DialTLS: func(netw, addr string, cfg *tls.Config) (net.Conn, error) {
              return net.Dial(netw, addr)
           },
        },
}

和链接:

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>