Rumah > pembangunan bahagian belakang > Golang > Pergi: Tarikh akhir ResponseController tidak dihormati

Pergi: Tarikh akhir ResponseController tidak dihormati

王林
Lepaskan: 2024-02-09 12:09:08
ke hadapan
857 orang telah melayarinya

Go:不遵守 ResponseController 的截止日期

editor php Strawberry di sini untuk memperkenalkan kepada anda tentang "Pergi: Tidak mematuhi tarikh akhir ResponseController". Dalam pembangunan perisian, ResponseController ialah pengawal biasa yang digunakan untuk mengendalikan permintaan respons. Walau bagaimanapun, kadangkala pembangun mungkin mengabaikan untuk mematuhi tarikh akhir ResponseController semasa menulis kod, yang mungkin membawa kepada beberapa masalah. Artikel ini akan meneroka isu ini secara terperinci dan menyediakan penyelesaian untuk memastikan kebolehpercayaan dan kestabilan kod anda.

Kandungan soalan

Saya mempunyai beberapa kod di mana saya cuba membatalkan penulisan semula kepada pelanggan jika penulisan mengambil masa terlalu lama. Saya fikir saya boleh menggunakan http.responsecontroller untuk mencapai ini kerana ia mempunyai kaedah setwritedeadline.

Malangnya, dalam kod di bawah, rw.write tidak mengembalikan ralat selepas tarikh akhir berlalu.

Adakah cara lain untuk membatalkan penulisan?

package main

import (
    "log"
    "net/http"
    "time"
)

func main() {
    http.handlefunc("/", func(rw http.responsewriter, r *http.request) {
        log.println(r.method, r.url.path)

        rc := http.newresponsecontroller(rw)
        dl := time.now().add(3 * time.second)
        if err := rc.setwritedeadline(dl); err != nil {
            log.println(err)
            return
        }
        log.println("write deadline:", dl)

        var total int
        for _, b := range []byte("what!\n") {
            time.sleep(time.second)

            n, err := rw.write([]byte{b})
            if err != nil {
                log.println(err)
                return
            }

            total += n
            log.println("bytes written", n)
        }

        log.println(r.method, r.url.path, "write total", total)
    })

    http.listenandserve(":8080", nil)
}
Salin selepas log masuk
$ go run main.go 
2023/04/26 12:24:40 get /
2023/04/26 12:24:40 write deadline: 2023-04-26 12:24:43.303884739 -0700 pdt m=+11.5891
16304
2023/04/26 12:24:41 bytes written 1
2023/04/26 12:24:42 bytes written 1
2023/04/26 12:24:43 bytes written 1
2023/04/26 12:24:44 bytes written 1
2023/04/26 12:24:45 bytes written 1
2023/04/26 12:24:46 bytes written 1
2023/04/26 12:24:46 get / write total 6
Salin selepas log masuk
$ curl http://localhost:8080/
curl: (52) Empty reply from server
Salin selepas log masuk

Penyelesaian

setwritedeadline documentation berkata:

setwritedeadline Tetapkan tarikh akhir untuk menulis respons. Menulis badan respons selepas tarikh akhir telah berlalu tidak akan disekat, tetapi mungkin berjaya jika data ditimbal.

Tulis kepada penulis respons dalam soalan berjaya kerana jumlah kecil data yang ditulis oleh aplikasi ditimbal.

Ralat "Balasan kosong daripada pelayan" daripada curl menunjukkan bahawa tarikh akhir dihormati apabila pelayan membuang respons kepada sambungan rangkaian asas apabila ia kembali daripada pengendali.

Gunakan setwritedeadline untuk mengelakkan pelanggan lambat.

Gunakan konteks dengan tarikh akhir untuk mengehadkan masa yang diperlukan pelayan untuk menjana respons:

65bd46fc4 Februari

Atas ialah kandungan terperinci Pergi: Tarikh akhir ResponseController tidak dihormati. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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