如何调整Go语言的http客户端(或传输端)来模拟curls --http 2-prior-knowledge flag?

bbmckpt7  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(143)

我正在与一个服务器交互(这是我无法控制的),如果请求包含内容(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上被卡住了。

❯ 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时,协议没有升级。
我想我需要理解的是,如何在Go语言中模仿curl的先验知识标志,这可能吗?

ahy6op9u

ahy6op9u1#

我通过指定一个跳过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)
           },
        },
}

和链接:

相关问题