Maison > développement back-end > Golang > Pourquoi `json.NewDecoder().Decode()` ne respecte-t-il pas les délais de contexte HTTP ?

Pourquoi `json.NewDecoder().Decode()` ne respecte-t-il pas les délais de contexte HTTP ?

Mary-Kate Olsen
Libérer: 2024-10-29 09:34:29
original
740 Les gens l'ont consulté

Why doesn't `json.NewDecoder().Decode()` respect HTTP Context Deadlines?

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()
Copier après la connexion

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal