Accès au socket sous-jacent d'une réponse net/http dans Go
Introduction
Pendant En développant une application Web à l'aide du package net/http de Go, il peut être nécessaire d'accéder au socket sous-jacent associé à une réponse HTTP. Cela permet l'exécution d'opérations supplémentaires spécifiques à la plate-forme sur le socket, telles que les appels système TCP_INFO.
Solutions
Utilisation du contexte de requête (Go 1.13 et plus tard)
Dans Go 1.13 et versions ultérieures, l'objet net.Conn peut être stocké dans le Request Contexte, permettant un accès facile au sein de la fonction de gestionnaire.
<code class="go">func GetConn(r *http.Request) (net.Conn) { return r.Context().Value(ConnContextKey).(net.Conn) }</code>
Utilisation de RemoteAddr et de Connections Map (Pre-Go 1.13)
Pour les serveurs écoutant sur les ports TCP, un une clé unique peut être générée à partir du RemoteAddr de chaque connexion à l'aide d'une carte globale.
<code class="go">func GetConn(r *http.Request) (net.Conn) { return conns[r.RemoteAddr] }</code>
Remplacement RemoteAddr pour UNIX Socket
Pour les serveurs écoutant sur des sockets UNIX, le RemoteAddr est toujours "@", rendant l'approche précédente inefficace. Pour résoudre ce problème, remplacez net.Listener.Accept() et redéfinissez la méthode RemoteAddr().
<code class="go">type remoteAddrPtrConn struct { net.Conn ptrStr string } func (self remoteAddrPtrConn) RemoteAddr() (net.Addr) { return remoteAddrPtr{self.ptrStr} }</code>
Notes supplémentaires
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!