2016-08-31 42 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 
} 
相關問題