首頁 > 後端開發 > Golang > Go:不遵守 ResponseController 的截止日期

Go:不遵守 ResponseController 的截止日期

王林
發布: 2024-02-09 12:09:08
轉載
837 人瀏覽過

Go:不遵守 ResponseController 的截止日期

php小編草莓在這裡帶給大家關於"Go:不遵守 ResponseController 的截止日期"的介紹。在軟體開發中,ResponseController 是一個常見的控制器,用於處理回應請求。然而,有時開發者在編寫程式碼時可能會忽略對 ResponseController 的截止日期的遵守,這可能會導致一系列問題。本文將詳細探討這個問題,並提供解決方案,以確保程式碼的可靠性和穩定性。

問題內容

我有一些程式碼,如果寫入時間太長,我會嘗試取消寫回客戶端。我想我可以使用 http.responsecontroller 來實現此目的,因為它有一個 setwritedeadline 方法。

不幸的是,在下面的程式碼中,rw.write 在截止日期過後不會回傳錯誤。

還有其他方法可以取消寫入嗎?

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
登入後複製

解決方法

setwritedeadline 文件說:

setwritedeadline 設定寫入回應的截止日期。超過截止時間後寫入回應正文不會阻塞,但如果資料已緩衝,則可能會成功。

問題中對回應編寫器的寫入成功,因為應用程式寫入的少量資料被緩衝。

來自curl的「來自伺服器的空回覆」錯誤表明,當伺服器從處理程序返回時將回應刷新到底層網路連線時,就遵守了截止日期。

使用 setwritedeadline 來防止客戶端速度緩慢。

使用帶有截止日期的上下文來限制伺服器產生回應所花費的時間:

65bd46fc4二月

以上是Go:不遵守 ResponseController 的截止日期的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板