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

Pergi: Tarikh akhir ResponseController tidak dihormati

王林
王林ke hadapan
2024-02-09 12:09:08836semak imbas

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)
}
$ 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
$ curl http://localhost:8080/
curl: (52) Empty reply from server

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam