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 と接続マップの使用 (Pre-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 中国語 Web サイトの他の関連記事を参照してください。