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
}