Délai de contexte HTTP ignoré par json.NewDecoder().Decode()
Question :
Lors de l'utilisation de context.WithTimeout pour établir un délai pour une requête HTTP, la méthode ioutil.ReadAll interrompt la requête et renvoie une erreur appropriée lorsque le délai d'attente est dépassé. Cependant, json.NewDecoder(resp.Body).Decode semble ignorer la date limite, renvoyant une erreur nulle au lieu de context.DeadlineExceeded. Est-ce un bug ?
Réponse :
Non, ce n'est pas un bug. Le package net/http utilise des tampons pour traiter les requêtes, ce qui entraîne la possibilité d'une lecture partielle ou complète du corps de la réponse dans des tampons avant que le programme ne le lise. Par conséquent, un contexte expirant n'empêche pas nécessairement le programme de terminer l'opération de lecture.
Exemple :
Considérons un serveur de test HTTP modifié qui retarde intentionnellement les réponses. Lors de l'utilisation de readDoesntFail, le serveur envoie une réponse partielle (10 octets), la vide et attend 6 secondes avant d'envoyer le reste.
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { s := []byte(`{"ip":"12.34.56.78"}`) w.Write(s[:10]) if f, ok := w.(http.Flusher); ok { f.Flush() } time.Sleep(time.Second * 6) w.Write(s[10:])})) defer ts.Close()
Dans ce scénario, json.Decoder.Decode() tente de lire de la connexion car les données ne sont pas encore mises en mémoire tampon. Une fois le contexte expiré, une lecture plus approfondie de la connexion déclenche une erreur context.DeadlineExceeded.
Conclusion :
json.Decoder.Decode() respectera la date limite du contexte lorsque les données ne sont pas encore mises en mémoire tampon. Cependant, si les données sont partiellement ou entièrement mises en mémoire tampon, le délai de contexte ne peut pas empêcher le programme de terminer l'opération de lecture. Il est recommandé d'utiliser ioutil.ReadAll ou une approche similaire pour un comportement plus cohérent avec les délais contextuels.
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!