【发布时间】:2021-04-30 20:31:30
【问题描述】:
我正在编写一个需要调用 DumpRequest 的 http 代理。出于某种原因,客户端在服务器需要时不提供“主机”标头。然后我这样做:
if req.Header.Get("host") == "" {
req.Header.Set("Host", "www.domain.com:80")
}
data, _ := httputil.DumpRequest(req, true)
conn.Write(data)
问题是我设置“主机”后,data 仍然没有。我深入研究了 DumpRequest 的源代码,发现了这个:
var reqWriteExcludeHeaderDump = map[string]bool{
"Host": true, // not in Header map anyway
"Transfer-Encoding": true,
"Trailer": true,
}
为什么Host“反正不在Header map中”?
【问题讨论】:
-
主机在请求上有一个专用参数
-
@Chris Townsend 不明白这意味着什么。这是我的代理尝试转发的请求。后端服务器返回“400 Bad Request missing required header Host”...这就是我尝试添加 Host: 标头的原因。
-
您不要使用
Header.Set更改主机。您可以使用req.Host直接访问它,就像我的回答显示的那样 -
@ChrisTownsend 看到 Header.Set 和 Header.Add 的源代码,逻辑一清二楚。