63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
|
package runtime
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
)
|
||
|
|
||
|
// DefaultBufferSize is the default size of buffers. It is set to 4KB by default, which is the
|
||
|
// same as the default buffer size of bufio.Writer.
|
||
|
var DefaultBufferSize = 4 * 1024 // 4KB
|
||
|
|
||
|
// Buffer is a wrapper around bufio.Writer that enables flushing and closing of
|
||
|
// the underlying writer.
|
||
|
type Buffer struct {
|
||
|
Underlying io.Writer
|
||
|
b *bufio.Writer
|
||
|
}
|
||
|
|
||
|
// Write the contents of p into the buffer.
|
||
|
func (b *Buffer) Write(p []byte) (n int, err error) {
|
||
|
return b.b.Write(p)
|
||
|
}
|
||
|
|
||
|
// Flush writes any buffered data to the underlying io.Writer and
|
||
|
// calls the Flush method of the underlying http.Flusher if it implements it.
|
||
|
func (b *Buffer) Flush() error {
|
||
|
if err := b.b.Flush(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if f, ok := b.Underlying.(http.Flusher); ok {
|
||
|
f.Flush()
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Close closes the buffer and the underlying io.Writer if it implements io.Closer.
|
||
|
func (b *Buffer) Close() error {
|
||
|
if c, ok := b.Underlying.(io.Closer); ok {
|
||
|
return c.Close()
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Reset sets the underlying io.Writer to w and resets the buffer.
|
||
|
func (b *Buffer) Reset(w io.Writer) {
|
||
|
if b.b == nil {
|
||
|
b.b = bufio.NewWriterSize(b, DefaultBufferSize)
|
||
|
}
|
||
|
b.Underlying = w
|
||
|
b.b.Reset(w)
|
||
|
}
|
||
|
|
||
|
// Size returns the size of the underlying buffer in bytes.
|
||
|
func (b *Buffer) Size() int {
|
||
|
return b.b.Size()
|
||
|
}
|
||
|
|
||
|
// WriteString writes the contents of s into the buffer.
|
||
|
func (b *Buffer) WriteString(s string) (n int, err error) {
|
||
|
return b.b.WriteString(s)
|
||
|
}
|