在 Go 中访问 net/http 响应的底层套接字
简介
虽然使用 Go 的 net/http 包开发 Web 应用程序时,可能需要访问与 HTTP 响应关联的底层套接字。这允许在套接字上执行其他特定于平台的操作,例如 TCP_INFO 系统调用。
解决方案
使用请求上下文(Go 1.13 和稍后)
在 Go 1.13 及更高版本中,net.Conn 对象可以存储在请求上下文中,从而可以在处理程序函数中轻松访问。
<code class="go">func GetConn(r *http.Request) (net.Conn) { return r.Context().Value(ConnContextKey).(net.Conn) }</code>
使用 RemoteAddr 和连接映射(Go 1.13 之前的版本)
对于侦听 TCP 端口的服务器,可以使用全局映射从每个连接的 RemoteAddr 生成唯一密钥。
<code class="go">func GetConn(r *http.Request) (net.Conn) { return conns[r.RemoteAddr] }</code>
覆盖 UNIX 套接字的 RemoteAddr
对于在 UNIX 套接字上侦听的服务器,RemoteAddr 始终为“@”,这使得之前的方法无效。要解决此问题,请重写 net.Listener.Accept() 并重新定义 RemoteAddr() 方法。
<code class="go">type remoteAddrPtrConn struct { net.Conn ptrStr string } func (self remoteAddrPtrConn) RemoteAddr() (net.Addr) { return remoteAddrPtr{self.ptrStr} }</code>
附加说明
以上是如何在 Go 中访问 net/http 响应的底层套接字?的详细内容。更多信息请关注PHP中文网其他相关文章!