Go发送HTTP/2请求时httputil.DumpRequest输出HTTP/1.1的原因是什么?
问题原因分析
httputil.DumpRequest的输出直接取自你传入的*http.Request结构体的Proto相关字段,Go标准库初始化请求对象时会默认将该字段赋值为HTTP/1.1,此时请求还未经过HTTP/2传输层处理。- 你的Dump操作执行在
client.Do(request)调用之前,http2.Transport还没有开始处理请求,不会修改请求对象的协议版本字段、也不会完成HTTP/2协议的协商和封装逻辑,自然拿到的是默认的1.1版本标识。 http2.Transport在处理请求时默认不会修改用户传入的原始请求对象,就算你在请求发送后再Dump原始请求,拿到的依然是初始化的HTTP/1.1标识。
正确验证HTTP/2的方法
要确认请求实际使用的协议版本,应该读取返回的响应对象的Proto字段,示例代码如下:
response, err := client.Do(request) if err != nil { // 自定义错误处理逻辑 return "", err } // 输出实际协商使用的协议版本 fmt.Println("实际使用协议:", response.Proto) // 正常配置下此处会输出 HTTP/2.0
注意:如果需要排查HTTP/2的请求内容,不要依赖原始请求对象的Dump结果,可以通过抓包工具(如Wireshark)或者开启http2传输层的调试日志获取实际发送的帧数据。
内容的提问来源于stack exchange,提问作者overtheman
相关产品推荐
相关产品推荐

