Maison > développement back-end > Golang > Json.NewDecoder().Decode() respecte-t-il les délais contextuels lorsque les corps de réponse sont mis en mémoire tampon ?

Json.NewDecoder().Decode() respecte-t-il les délais contextuels lorsque les corps de réponse sont mis en mémoire tampon ?

Mary-Kate Olsen
Libérer: 2024-10-30 05:25:28
original
394 Les gens l'ont consulté

 Does json.NewDecoder().Decode() Respect Context Deadlines When Response Bodies are Buffered?

Go json.NewDecoder().Decode() Problème de délai d'attente contextuel

Dans les programmes Go, les délais contextuels fournissent un moyen de définir des délais d'attente pour certaines opérations. Cependant, un utilisateur a signalé un comportement inattendu lors de l'utilisation de json.NewDecoder().Decode().

Préoccupations de l'utilisateur

L'utilisateur attendait json.NewDecoder(). Decode() pour respecter la date limite de contexte fixée pour le programme. Ils ont observé que la lecture du corps de la réponse à l’aide de ioutil.ReadAll() déclenchait une erreur de dépassement du délai de contexte, comme prévu. Cependant, lorsqu'ils sont passés à json.NewDecoder().Decode(), aucune erreur n'a été signalée, malgré le temps écoulé dépassant la date limite.

Exemple de code

<code class="go">ctx, _ := context.WithTimeout(context.Background(), time.Second*5)

req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
...

time.Sleep(time.Second * 6)
fmt.Println("before reading response body, context error is:", ctx.Err())
err = json.NewDecoder(resp.Body).Decode(ipResponse)
if err != nil {
    panic(err)
}
fmt.Println("Expected panic but there was none")</code>
Copier après la connexion

Réponse

La différence de comportement provient de l'utilisation de tampons dans le package net/http. Selon la taille et la configuration de la réponse, le corps peut être partiellement ou totalement mis en mémoire tampon avant d'être lu. Cela signifie que lorsque json.NewDecoder().Decode() est utilisé, le contexte expiré peut ne pas empêcher l'accès aux données mises en mémoire tampon.

Pour illustrer cela, un serveur de test a été créé qui a intentionnellement retardé le corps de la réponse. . Il simulait le comportement de mise en mémoire tampon partielle du package net/http. Lorsque readDoesntFail() a été exécuté avec ce serveur de test, l'erreur de dépassement du délai de contexte attendu s'est effectivement déclenchée.

Conclusion

Le comportement observé dans le code de l'utilisateur met en évidence le potentiel mises en garde concernant l'utilisation de json.NewDecoder().Decode() avec des délais contextuels. Il est important de savoir que si le corps de la réponse est volumineux et a été complètement mis en mémoire tampon, le délai de contexte peut ne pas être appliqué comme prévu.

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