簡體   English   中英

如何使用net / http打破大塊?

[英]How to break a chunked in go using net/http?

我有一個帶有端點的http服務器,該端點返回從db流傳輸的大量數據。 響應是分塊的( < Transfer-Encoding: chunked )。 如果遇到錯誤(例如數據庫崩潰),我可以使用panic&curl來警告我一個問題:

curl: (18) transfer closed with outstanding read data remaining

我不想恐慌-我只想要一條簡單的日志消息。 而且,如果我recover()我不會在卷曲中收到錯誤,因此沒有跡象表明發生了損壞。

有沒有辦法打破大塊的http響應而不會出現恐慌?

您從curl看到的錯誤是因為HTTP服務器在看到緊急情況時立即關閉了該連接。 為了強制關閉連接而不會出現panic ,您必須劫持它:

// inside the http handler
// func(w http.ResponseWriter, r *http.Request) {

// to abort an HTTP/1.1 response
if w, ok := w.(http.Hijacker); ok {
    c, _, err := w.Hijack()
    if err != nil {
        log.Println("cannot close connection:", err)
        return
    }
    c.Close()
    return
}

在Go 1.7中,劫持(JimB的回答中提出)可能是最好的解決方案。 不幸的是,它僅在HTTP / 1.1中有效-在HTTP / 2中不會做任何有用的事情。

Go 1.8引入了一個新值ErrAbortHandler ,中斷HTTP響應中途的官方方式是panic(http.ErrAbortHandler) ,該方法適用於HTTP / 1.1和HTTP.2。 問題17790中對此進行了描述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM