2016-08-31 3 views
0

チャンクプロトコルによるリクエストに応答するhttpサーバがあります。この単純な例では、毎秒の時間で応答します。私はこのタイムサーバに要求を転送し、同じチャンクプロトコルで応答する別のサーバを持っています。チャンクトランスポートを使用しているhttpサーバからの応答を読み込み、ストリーミングする

カール-iはlocalhost:8000が正しいことに返す

しかしカール-iはlocalhost:9000は、チャンク応答だけ後3秒(毎秒ない)を返します。これは、何らかの形でio.copyが実際に出力をフラッシュしないことを意味します。

答えて

2

io.CopyFlushに電話する前に内容全体をコピーする必要があります。バッファがいっぱいになる前に内容を送信したい場合は、それぞれの書き込み後にflushを呼び出す必要があります。

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.ResponseWriterをフラッシュ io.Copy

完全なバージョンは次のようになります。

関連する問題