http.request结构体包含请求发送方的远程IP和端口:
// RemoteAddr allows HTTP servers and other software to record
// the network address that sent the request, usually for
// logging. This field is not filled in by ReadRequest and
// has no defined format. The HTTP server in this package
// sets RemoteAddr to an "IP:port" address before invoking a
// handler.
// This field is ignored by the HTTP client.
**RemoteAddr string**
http.response对象没有这样的字段。
我想知道响应我发送的请求的IP地址,即使我将其发送到DNS地址。
我认为net.lookupHost()可能会有帮助,但是1)它可以为一个主机名返回多个IP,2)除非cgo可用,否则它会忽略hosts文件,而在我的情况下cgo不可用。
是否可以检索远程IP地址以获取http.response?
2条答案
按热度按时间jw5wzhpr1#
使用net/http/httptrace包和
GotConnInfo
钩子来捕获net.Conn
及其对应的Conn.RemoteAddr()
。这将为您提供
Transport
实际拨打的地址,而不是在DNSDoneInfo
中解析的地址:输出:
yc0p9oo02#
我想到的另一个解决方案是在http客户端传输中使用
DialContext
函数的钩子,这是一个特定的解决方案,它允许你修改http.Client
而不是请求,这可能是有用的。我们首先创建一个返回挂接拨号上下文的函数
然后,我们可以使用此函数创建一个
DialContext
,它写入一个out参数