forked from influxdata/influxdb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
io.go
44 lines (35 loc) · 790 Bytes
/
io.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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
}