为了账号安全,请及时绑定邮箱和手机立即绑定

Go http 请求回退到 http2,即使强制尝试设置为 false

Go http 请求回退到 http2,即使强制尝试设置为 false

Go
Helenr 2022-09-05 09:58:33
有一件奇怪的事情,每隔几个请求就会发生一次,Go的包会抛出以下错误:httphttp2: server sent GOAWAY and closed the connection; LastStreamID=19999, ErrCode=NO_ERROR, debug=""因此,我意识到默认传输已设置为(https://golang.org/src/net/http/transport.go 行48),因此我手动将其设置为false,如下所示:ForceAttemptHTTP2true    transport := &http.Transport{        ForceAttemptHTTP2: false,    }    httpClient := &http.Client{Transport: transport}但即使这样做了,我仍然会得到相同的http2错误而不是http1,这对我来说没有意义吗?我是网络新手,所以我有一种感觉,我错过了一些在这里应该很明显的东西?我想问题是我如何强制软件包仅使用而不使用httphttphttp2
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

这似乎做到了:


package main


import (

   "crypto/tls"

   "net/http"

)


func main() {

   client := &http.Client{

      Transport: &http.Transport{

         TLSNextProto: map[string]func(string, *tls.Conn)http.RoundTripper{},

      },

   }

   req, e := http.NewRequest("HEAD", "https://stackoverflow.com", nil)

   if e != nil {

      panic(e)

   }

   res, e := client.Do(req)

   if e != nil {

      panic(e)

   }

   println(res.Proto == "HTTP/1.1")

}

必须禁用 HTTP/2 的程序可以通过将(对于客户端)或(对于服务器)设置为非 nil 的空映射来执行此操作。Transport.TLSNextProtoServer.TLSNextProto


https://golang.org/pkg/net/http#pkg-overview


诚然,这是非常尴尬的语法,所以你可能更喜欢这样的东西:


package main


import (

   "net/http"

   "os"

)


func main() {

   os.Setenv("GODEBUG", "http2client=0")

   req, e := http.NewRequest("HEAD", "https://stackoverflow.com", nil)

   if e != nil {

      panic(e)

   }

   res, e := new(http.Client).Do(req)

   if e != nil {

      panic(e)

   }

   println(res.Proto == "HTTP/1.1")

}


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 586 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信