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
DDDoriginal
2024-12-08 02:43:10563parcourir

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:])
}

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!

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