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
Mary-Kate Olsenasal
2024-12-19 15:21:10248semak imbas

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

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!

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