Go语言 程序看不到主机标头

r9f1avp5  于 2022-12-25  发布在  Go
关注(0)|答案(1)|浏览(161)

尝试代理一个请求,我发现接收到的标头中不存在主机标头
更新:正如其中一个答案所指出的,我可能需要主机字段,这也不会改变,主机头仍然不存在。
代码:

request, err := http.ReadRequest(bufio.NewReader(conn))
    if err != nil {
        log.Println("Error reading request", err)
        return
    }

    target, err := net.Dial("tcp", request.URL.Host)
    if err != nil {
        log.Println(host)
        log.Println("Error reaching target", err)
    }
    defer target.Close()

旋度命令

curl -v localhost:8080

输出:

Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.79.1
> Accept: */*
>

所以主机头出现在curl中。
在程序中添加了一个调试步骤以打印标题

fmt.Println("Headers:")
    for key, values := range request.Header {
        fmt.Printf("%s: %v\n", key, values)
    }

程序输出:

Headers:
Accept: [*/*]
User-Agent: [curl/7.79.1]

仍不存在主机标头
现在,我尝试使用curl传递主机头:

curl -v -H 'Host: localhost:3000' localhost:8080

相同的输出,标题出现在curl中,但不在程序中

wvt8vs2t

wvt8vs2t1#

您需要的是Request类型的Host字段。
//对于服务器请求,Host指定在其上执行
//查找URL。对于HTTP/1(根据RFC 7230第5.4节),
//是“Host”标头的值或主机名
//在URL本身中给定。对于HTTP/2,它是
//“:authority”伪头字段。
//格式可以是“host:port”。对于国际域
//名称,主机可以是Punycode或Unicode格式。使用
golang.org/x/net/idna将其转换为任一格式,如果
//需要。
//若要防止DNS重新绑定攻击,服务器处理程序应该
//验证Host标头是否具有一个值,对于该值,
//处理程序认为自己具有权威性。
// ServeMux支持注册到特定主机的模式
//命名并保护其注册的处理程序。
// //对于客户端请求,Host可选择覆盖Host
//标头。如果为空,则Request.Write方法使用
//URL.Host的值。Host可以包含国际
//域名。
主机字符串

相关问题