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
Lepaskan: 2024-12-08 02:43:10
asal
588 orang telah melayarinya

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:])
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan