Go json.NewDecoder().Decode() Problème de délai de contexte
Dans les programmes Go, les délais de contexte 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 s'attendait à ce que 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
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")
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 entièrement 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é entièrement mis en mémoire tampon, le délai de contexte peut ne pas être appliqué comme prévu.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3