Maison >développement back-end >Golang >Pourquoi les requêtes HTTP POST manquent-elles les signaux d'annulation de contexte dans Go ?

Pourquoi les requêtes HTTP POST manquent-elles les signaux d'annulation de contexte dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-19 15:21:10248parcourir

Why Do HTTP POST Requests Miss Context Cancellation Signals in Go?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn