本文を含む HTTP リクエストでのコンテキスト キャンセレーション シグナル損失
Go で HTTP サーバーを開発しているときに、context.Done( ) チャネルは、本文のあるリクエストのクライアント切断信号をキャプチャできませんでした。この動作は、クライアントの離脱を正常に検出した GET リクエストとは異なります。
根本的な原因
この不一致は、net/http サーバーの機能に起因します。その接続チェック メカニズムは、アプリケーションがリクエスト本文を読み取るときにのみ開始されます。 GET リクエストには本文がないため、接続チェックが即座にトリガーされ、サーバーがクライアントのキャンセルを即座に検出できるようになります。ただし、POST リクエストの場合、サーバーは接続チェックを開始する前に本文が読み取られるまで待機します。
解決策
この問題を解決するには、リクエスト本文を使用してサーバーの接続チェックプロセスを刺激します。次のコード スニペットはこれを示しています。
func handler(w http.ResponseWriter, r *http.Request) { go func(done <-chan struct{}) { <-done fmt.Println("message", "client connection has gone away, request got cancelled") }(r.Context().Done()) io.Copy(ioutil.Discard, r.Body) // Read the body time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
リクエスト本文を明示的に読み取ることにより、サーバーは、本文のあるリクエストであっても、クライアントの切断を即座に検出できます。これにより、サーバー側で適切なクリーンアップとリソースの解放が可能になります。
以上がGo で HTTP POST リクエストがコンテキストキャンセルシグナルを見逃すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。