Rumah >pembangunan bahagian belakang >Golang >Mengapa Pakej `http` Go terlepas Isyarat Pembatalan dalam Permintaan POST dengan Badan?

Mengapa Pakej `http` Go terlepas Isyarat Pembatalan dalam Permintaan POST dengan Badan?

Linda Hamilton
Linda Hamiltonasal
2024-12-11 06:17:09185semak imbas

Why Does Go's `http` Package Miss Cancellation Signals in POST Requests with Bodies?

Pakej Go http: Tangkap Isyarat Pembatalan dalam Permintaan dengan Badan

Soalan: Mengapa pakej Go http gagal menangkap isyarat pembatalan untuk POST permintaan dengan badan?

Jawapan: Pelayan http Go membaca badan permintaan untuk mengesan apabila pelanggan menutup sambungan. Sehingga badan dibaca, tiada semakan untuk sambungan tertutup dibuat.

Oleh itu, untuk mengendalikan perkara ini dengan betul, baca badan permintaan secepat mungkin, walaupun ia tidak diperlukan dalam logik pengendalian permintaan.

Penyelesaian:

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:])
}

Apabila pelanggan menutup sambungan awal, kod ini akan mengesannya dan membatalkan sebarang sambungan yang sedang berjalan. kerja.

Atas ialah kandungan terperinci Mengapa Pakej `http` Go terlepas Isyarat Pembatalan dalam Permintaan POST dengan Badan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn