2016-08-31 43 views
0

我有一个http服务器通过块协议响应请求。在这个简单的例子中,它每秒响应一次。我有另一台服务器将请求转发给这个时间服务器,并使用相同的块协议进行响应。读取和流式传输来自使用块传输的http服务器的响应

卷曲-i本地主机:8000返回正确的事情

然而卷曲-i本地主机:9000返回响应分块,但仅三个秒后(不每秒)。这意味着,不知何故,io.copy并没有真正冲洗输出,只要它来了

回答

2

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 
} 
相关问题