Package http Go : Capturer le signal d'annulation dans les requêtes avec des corps
Question : Pourquoi le package http Go ne parvient-il pas à capturer les signaux d'annulation pour le POST requêtes avec des corps ?
Réponse : Le serveur http de Go lit le corps de la requête pour détecter quand le client ferme la connexion. Jusqu'à ce que le corps soit lu, aucune vérification des connexions fermées n'est effectuée.
Par conséquent, pour gérer cela correctement, lisez le corps de la demande dès que possible, même s'il n'est pas nécessaire dans la logique de traitement de la demande.
Solution :
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 to detect the closed connection time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
Lorsque le client ferme la connexion plus tôt, ce code le détectera et annulera tout travail en cours.
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!