Go http パッケージ: ボディを含むリクエストのキャンセル シグナルをキャプチャする
質問: Go http パッケージが POST のキャンセル シグナルをキャプチャできないのはなぜですかボディを含むリクエスト?
答え: Go の http サーバーは、クライアントがリクエストボディを閉じたときを検出するためにリクエストボディを読み取ります。 繋がり。本文が読み取られるまで、閉じられた接続のチェックは行われません。
したがって、これを正しく処理するには、リクエスト処理ロジックで必要ない場合でも、できるだけ早くリクエスト本文を読み取ります。
解決策:
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 to detect the closed connection time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
クライアントが接続を早期に閉じると、このコードはそれを検出し、進行中の作業をキャンセルします。
以上がGo の「http」パッケージがボディを含む POST リクエストのキャンセル シグナルを見逃すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。