0
我有一個http服務器通過塊協議響應請求。在這個簡單的例子中,它每秒響應一次。我有另一臺服務器將請求轉發給這個時間服務器,並使用相同的塊協議進行響應。讀取和流式傳輸來自使用塊傳輸的http服務器的響應
捲曲-i本地主機:8000返回正確的事情
然而捲曲-i本地主機:9000返回響應分塊,但僅三個秒後(不每秒)。這意味着,不知何故,io.copy並沒有真正沖洗輸出,只要它來了
我有一個http服務器通過塊協議響應請求。在這個簡單的例子中,它每秒響應一次。我有另一臺服務器將請求轉發給這個時間服務器,並使用相同的塊協議進行響應。讀取和流式傳輸來自使用塊傳輸的http服務器的響應
捲曲-i本地主機:8000返回正確的事情
然而捲曲-i本地主機:9000返回響應分塊,但僅三個秒後(不每秒)。這意味着,不知何故,io.copy並沒有真正沖洗輸出,只要它來了
io.Copy
必須複製整個內容,然後再調用Flush
。如果你想在緩衝區填滿之前發送內容,你需要在每次寫入之後調用flush。
每個寫入之後刷新的http.ResponseWriter
的io.Copy
完整版本會是什麼樣子:
func flushCopy(dst io.Writer, src io.Reader) (written int64, err error) {
buf := make([]byte, 1024 * 8)
flusher, canFlush := dst.(http.Flusher)
for {
nr, er := src.Read(buf)
if nr > 0 {
nw, ew := dst.Write(buf[0:nr])
if nw > 0 {
if canFlush {
flusher.Flush()
}
written += int64(nw)
}
if ew != nil {
err = ew
break
}
if nr != nw {
err = io.ErrShortWrite
break
}
}
if er == io.EOF {
break
}
if er != nil {
err = er
break
}
}
return written, err
}