Maison > développement back-end > Golang > Pourquoi le contexte HTTP de Go ne détecte-t-il pas les signaux d'annulation avec les corps de requête ?

Pourquoi le contexte HTTP de Go ne détecte-t-il pas les signaux d'annulation avec les corps de requête ?

DDD
Libérer: 2024-12-08 02:43:10
original
616 Les gens l'ont consulté

Why Doesn't Go's HTTP Context Detect Cancellation Signals with Request Bodies?

Le contexte HTTP Go ne parvient pas à détecter le signal d'annulation avec le corps de la demande

Dans le serveur HTTP de Go, les signaux contextuels peuvent fournir un mécanisme pour gérer les déconnexions des clients , permettant au serveur de nettoyer les ressources rapidement. Cependant, lorsqu'une requête inclut un corps, le canal Done du contexte se bloque, empêchant le serveur de détecter le départ du client.

Cause du comportement

La raison de ce comportement réside dans la façon dont le serveur HTTP lit la connexion. Jusqu'à ce que le corps de la requête soit lu, aucune vérification des connexions fermées n'est effectuée. Dans le cas des requêtes GET, aucun corps n'est présent, le serveur surveille donc activement la connexion. Cependant, avec les requêtes POST, le corps occupe un lecteur non bloquant, retardant la vérification de la connexion.

Solution

Pour résoudre ce problème, lisez explicitement le corps de la requête à l'intérieur la fonction de gestionnaire. Cette action déclenche la surveillance des connexions du serveur, garantissant qu'il peut détecter rapidement les déconnexions des clients.

Exemple de code

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())

    // Explicitly read the body to trigger connection monitoring
    io.Copy(ioutil.Discard, r.Body)

    time.Sleep(30 * time.Second)
    fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:])
}
Copier après la connexion

Cette modification invite le serveur à lire le corps de la requête immédiatement, en lançant le processus de surveillance de la connexion. Par conséquent, le serveur peut désormais détecter efficacement les déconnexions des clients, même en présence d'un corps de requête.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal