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 ?
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>
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!