Rumah > pembangunan bahagian belakang > Golang > Mengapa HTTP POST Meminta Isyarat Pembatalan Konteks dalam Go?

Mengapa HTTP POST Meminta Isyarat Pembatalan Konteks dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-12-19 15:21:10
asal
245 orang telah melayarinya

Why Do HTTP POST Requests Miss Context Cancellation Signals in Go?

Kehilangan Isyarat Pembatalan Konteks dalam Permintaan HTTP dengan Badan

Semasa membangunkan pelayan HTTP dalam Go, kebimbangan timbul: konteks.Selesai( ) saluran gagal menangkap isyarat putus sambungan pelanggan untuk permintaan dengan badan. Tingkah laku ini berbeza daripada permintaan GET, yang berjaya mengesan perlepasan pelanggan.

Punca Asas

Ketidakkonsistenan ini berpunca daripada fungsi pelayan net/http. Mekanisme semakan sambungannya bermula hanya apabila aplikasi membaca badan permintaan. Memandangkan permintaan GET tidak mempunyai badan, semakan sambungan dicetuskan serta-merta, membolehkan pelayan mengesan pembatalan pelanggan dengan segera. Walau bagaimanapun, untuk permintaan POST, pelayan menunggu sehingga kandungan dibaca sebelum memulakan semakan sambungan.

Penyelesaian

Untuk menyelesaikan isu ini, anda perlu membaca secara manual badan permintaan untuk merangsang proses semakan sambungan pelayan. Coretan kod berikut menunjukkan perkara ini:

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

Dengan membaca kandungan permintaan secara eksplisit, pelayan boleh mengesan pemutusan sambungan pelanggan dengan segera, walaupun untuk permintaan dengan badan. Ini membolehkan pembersihan yang betul dan keluaran sumber pada bahagian pelayan.

Atas ialah kandungan terperinci Mengapa HTTP POST Meminta Isyarat Pembatalan Konteks dalam Go?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan