Files
fasthttp/stream.go
T
Aliaksandr Valialkin e0225d4c98 typo fix
2015-12-09 16:36:16 +02:00

57 lines
1.1 KiB
Go

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