我有一個Web服務器的例子,如果你立即調用curl localhost:3000 -v
然後^C
(立即取消),它會報告write tcp 127.0.0.1:3000->127.0.0.1:XXXXX: write: broken pipe
。爲什麼golang http服務器響應超過8kb時出現「破損管道」失敗?
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
log.Fatal(http.ListenAndServe(":3000", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
time.Sleep(1 * time.Second)
// Why 8061 bytes? Because the response header on my computer
// is 132 bytes, adding up the entire response to 8193 (1 byte
// over 8kb)
if _, err := w.Write(make([]byte, 8061)); err != nil {
fmt.Println(err)
return
}
})))
}
根據我的調試,我已經能夠得出結論,這隻會發生,如果整個響應正在寫超過8192個字節(或8KB)。如果我的整個響應寫入少於8192,則不會返回broken pipe
錯誤。
我的問題是這是8192字節(或8kb)緩衝區限制集在哪裏?這是Golang的HTTP寫入緩衝區中的限制嗎?這與被分塊的響應有關嗎?這僅與curl
客戶端或瀏覽器客戶端有關?如何更改此限制,以便在連接關閉之前寫入更大的緩衝區(用於調試目的)?
謝謝!