package fasthttp import ( "bufio" "io" "runtime/debug" "sync" ) // StreamWriter must write data to w. // // Usually StreamWriter writes data to w in a loop (aka 'data streaming'). // // StreamWriter must return immediately if w returns error. // // Since the written data is buffered, do not forget calling w.Flush // when the data must be propagated to reader. type StreamWriter func(w *bufio.Writer) // NewStreamReader returns a reader, which replays all the data generated by sw. // // The returned reader may be passed to Response.SetBodyStream. // // See also Response.SetBodyStreamWriter. func NewStreamReader(sw StreamWriter) io.Reader { pr, pw := io.Pipe() var bw *bufio.Writer bwv := streamWriterBufPool.Get() if bwv == nil { bw = bufio.NewWriter(pw) bwv = bw } else { bw = bwv.(*bufio.Writer) bw.Reset(pw) } go func() { defer func() { if r := recover(); r != nil { defaultLogger.Printf("panic in StreamWriter: %s\nStack trace:\n%s", r, debug.Stack()) } }() sw(bw) bw.Flush() pw.Close() bw.Reset(nil) streamWriterBufPool.Put(bwv) }() return pr } var streamWriterBufPool sync.Pool