Rumah >pembangunan bahagian belakang >Golang >Mengapa Konteks HTTP Go Tidak Mengesan Isyarat Pembatalan dengan Badan Permintaan?

Mengapa Konteks HTTP Go Tidak Mengesan Isyarat Pembatalan dengan Badan Permintaan?

DDD
DDDasal
2024-12-08 02:43:10554semak imbas

Why Doesn't Go's HTTP Context Detect Cancellation Signals with Request Bodies?

Konteks HTTP Go Gagal Mengesan Isyarat Pembatalan dengan Badan Permintaan

Dalam pelayan HTTP Go, isyarat konteks boleh menyediakan mekanisme untuk mengendalikan pemutusan sambungan pelanggan , membenarkan pelayan membersihkan sumber dengan segera. Walau bagaimanapun, apabila permintaan termasuk badan, saluran Selesai konteks terhenti, menghalang pelayan daripada mengesan pemergian pelanggan.

Punca Tingkah Laku

Sebab kelakuan ini terletak pada cara pelayan HTTP membaca sambungan. Sehingga badan permintaan dibaca, tiada semakan untuk sambungan tertutup dilakukan. Dalam kes permintaan GET, tiada badan hadir, jadi pelayan secara aktif memantau sambungan. Walau bagaimanapun, dengan permintaan POST, badan itu menduduki pembaca yang tidak menyekat, menangguhkan pemeriksaan sambungan.

Penyelesaian

Untuk menyelesaikan isu ini, baca secara eksplisit badan permintaan dalam fungsi pengendali. Tindakan ini mencetuskan pemantauan sambungan pelayan, memastikan ia dapat mengesan pemutusan sambungan pelanggan dengan segera.

Contoh Kod

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

    // Explicitly read the body to trigger connection monitoring
    io.Copy(ioutil.Discard, r.Body)

    time.Sleep(30 * time.Second)
    fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:])
}

Pengubahsuaian ini menggesa pelayan membaca kandungan permintaan serta-merta, memulakan proses pemantauan sambungan. Akibatnya, pelayan kini boleh mengesan pemutusan sambungan pelanggan dengan berkesan, walaupun dengan kehadiran badan permintaan.

Atas ialah kandungan terperinci Mengapa Konteks HTTP Go Tidak Mengesan Isyarat Pembatalan dengan Badan Permintaan?. 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