在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中文網其他相關文章!