httputil转储请求主机头被排除?

httputil转储请求主机头被排除?,http,go,proxy,Http,Go,Proxy,我正在编写一个http代理,它需要调用DumpRequest。出于某种原因,当服务器需要时,客户端不提供“主机”头。然后我会这样做: if req.Header.Get("host") == "" { req.Header.Set("Host", "www.domain.com:80") } data, _ := httputil.DumpRequest(req, true) conn.Write(data)

我正在编写一个http代理,它需要调用DumpRequest。出于某种原因,当服务器需要时,客户端不提供“主机”头。然后我会这样做:

if req.Header.Get("host") == "" {
    req.Header.Set("Host", "www.domain.com:80")
}
data, _ := httputil.DumpRequest(req, true)
conn.Write(data)
问题是在我设置了“主机”之后,
数据
仍然没有它。我翻阅了DumpRequest的源代码,发现:

var reqWriteExcludeHeaderDump = map[string]bool{
    "Host":              true, // not in Header map anyway
    "Transfer-Encoding": true,
    "Trailer":           true,
}
为什么
Host
“无论如何都不在标题映射中”

简短回答 我想您应该使用
Header.Add()
而不是
Header.Set()

我没有试过。因此,如果我的答案是错误的,请自由地找出它

参考文献 从,它说,

它将替换与键关联的任何现有值

但在你的情况下,你没有K存在。因此,它的行为符合我们的预期


如果您使用
Set()
方法,这很酷。

如果您试图在请求通过代理时更改其原始主机值,则无需更改主机的头。您可以执行以下操作:

if req.Host == "" {
    req.Host = "www.domain.com"
}
data, _ := httputil.DumpRequest(req, true)
conn.Write(data)
操场

我确信这个答案是错误的。因为当我使用Set并转储req.Header时,主机被设置了。唯一的问题是它不在DumpRequest()的输出中。主机在request@Chris汤森德不明白这意味着什么。这是我的代理试图转发的请求。后端服务器返回“400错误请求缺少所需的头主机”。。。这就是为什么我试图添加回主机:header。您不能使用
header.Set更改主机。您可以直接使用
req.Host
访问它,就像我的答案一样shows@ChrisTownsend如果您看到Header.Set和Header.Add的源代码,逻辑非常清晰。这正是我所做的。请阅读问题并亲自测试:DumpRequest()之后,数据中没有“主机”标题。游乐场显示数据在ByTest中。这也不完全是您所做的,您使用的是
req.header.Set(“主机”,“www.domain.com:80”)
,它不会更改主机。它不起作用,而这个答案使用
req.Host