45 lines
790 B
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
|
|
}
|