influxdb/services/httpd/io.go

45 lines
790 B
Go

package httpd
import (
"errors"
"io"
)
var (
errTruncated = errors.New("Read: truncated")
)
// truncateReader returns a Reader that reads from r
// but stops with ErrTruncated after n bytes.
func truncateReader(r io.Reader, n int64) io.ReadCloser {
tr := &truncatedReader{r: &io.LimitedReader{R: r, N: n + 1}}
if rc, ok := r.(io.Closer); ok {
tr.Closer = rc
}
return tr
}
// A truncatedReader limits the amount of data returned to a maximum of r.N bytes.
type truncatedReader struct {
r *io.LimitedReader
io.Closer
}
func (r *truncatedReader) Read(p []byte) (n int, err error) {
n, err = r.r.Read(p)
if r.r.N <= 0 {
return n, errTruncated
}
return n, err
}
func (r *truncatedReader) Close() error {
if r.Closer != nil {
return r.Closer.Close()
}
return nil
}