gpt4 book ai didi

http - 从在 go 中使用 block 传输的 http 服务器读取和流式传输响应

转载 作者:数据小太阳 更新时间:2023-10-29 03:05:49 26 4
gpt4 key购买 nike

我有一个 http 服务器,它通过 block 协议(protocol)响应请求。在这个简单的例子中,它每秒响应一次时间。我有另一台服务器将请求转发到此时间服务器并使用相同的 block 协议(protocol)进行响应。

curl -i localhost:8000 返回正确的东西

但是 curl -i localhost:9000 返回分块响应,但仅在三秒后(不是每秒)返回。这意味着不知何故 io.copy 并没有真正在输出一出现就刷新输出

最佳答案

io.Copy 必须在您调用 Flush 之前复制全部内容。如果你想在缓冲区填满之前发送内容,你需要在每次写入后调用 flush。

在每次写入后刷新 http.ResponseWriterio.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
}

关于http - 从在 go 中使用 block 传输的 http 服务器读取和流式传输响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com