「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > json.NewDecoder().Decode() は、応答本文がバッファリングされるときにコンテキストの期限を尊重しますか?

json.NewDecoder().Decode() は、応答本文がバッファリングされるときにコンテキストの期限を尊重しますか?

2024 年 11 月 2 日に公開
ブラウズ:609

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

Go json.NewDecoder().Decode() コンテキスト期限の問題

Go プログラムでは、コンテキスト期限はタイムアウトを設定する手段を提供します。特定の操作。ただし、json.NewDecoder().Decode() の使用時に予期しない動作が発生することがユーザーから報告されました。

ユーザーの懸念事項

ユーザーは json.NewDecoder() を期待していました。 Decode() を使用して、プログラムに設定されたコンテキストの期限を尊重します。彼らは、ioutil.ReadAll() を使用して応答本文を読み取ると、予想どおりコンテキスト期限超過エラーが発生することを観察しました。ただし、json.NewDecoder().Decode() に切り替えると、経過時間が期限を超えていたにもかかわらず、エラーは報告されませんでした。

コード例

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")

Answer

動作の不一致は、net/http パッケージ内のバッファーの使用に起因します。応答のサイズと構成に応じて、本文は読み取られる前に部分的または完全にバッファリングされる場合があります。これは、json.NewDecoder().Decode() が使用される場合、期限切れのコンテキストによってバッファされたデータへのアクセスが妨げられない可能性があることを意味します。これを説明するために、応答本文を意図的に遅延させるテスト サーバーが作成されました。 。 net/http パッケージの部分的なバッファリング動作をシミュレートしました。このテスト サーバーで readDoesntFail() が実行されると、予想されるコンテキスト期限超過エラーが実際にトリガーされました。

結論

ユーザーのコードで観察された動作は、潜在的な問題を浮き彫りにしています。コンテキスト期限のある json.NewDecoder().Decode() を使用する場合の注意事項。応答本文が大きく、完全にバッファリングされている場合、コンテキストの期限が期待どおりに適用されない可能性があることに注意することが重要です。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3