httputil转储请求主机头被排除?
我正在编写一个http代理,它需要调用DumpRequest。出于某种原因,当服务器需要时,客户端不提供“主机”头。然后我会这样做: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)
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