![](/img/trans.png)
[英]How do you read and print a chunked HTTP response using java.net.http as chunks arrive?
[英]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.