Perte de signal d'annulation de contexte dans les requêtes HTTP avec corps
Lors du développement d'un serveur HTTP en Go, un souci est apparu : le contexte.Terminé( ) le canal n'a pas réussi à capturer les signaux de déconnexion du client pour les requêtes avec un corps. Ce comportement différait des requêtes GET, qui détectaient avec succès les départs de clients.
Cause sous-jacente
Cette incohérence provient du fonctionnement du serveur net/http. Son mécanisme de vérification de connexion ne démarre que lorsque l'application lit le corps de la requête. Étant donné que les requêtes GET n'ont pas de corps, la vérification de la connexion se déclenche immédiatement, permettant au serveur de détecter rapidement l'annulation du client. Cependant, pour les requêtes POST, le serveur attend que le corps soit lu avant de commencer les vérifications de connexion.
Solution
Pour résoudre ce problème, il est nécessaire de lire manuellement le corps de la requête pour stimuler le processus de vérification de la connexion du serveur. L'extrait de code suivant le démontre :
func handler(w http.ResponseWriter, r *http.Request) { go func(done <-chan struct{}) { <-done fmt.Println("message", "client connection has gone away, request got cancelled") }(r.Context().Done()) io.Copy(ioutil.Discard, r.Body) // Read the body time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
En lisant explicitement le corps de la requête, le serveur peut détecter rapidement les déconnexions des clients, même pour les requêtes comportant un corps. Cela permet un nettoyage approprié et une libération des ressources côté serveur.
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!