import (
"bytes"
+ "errors"
"fmt"
"io"
"log"
// Output:
// Go is a general-purpose language designed with systems programming in mind.
}
+
+func ExampleLimitedReader() {
+ r := strings.NewReader("some io.Reader stream to be read\n")
+ sentinel := errors.New("reached read limit")
+ lr := &io.LimitedReader{R: r, N: 4, Err: sentinel}
+
+ if _, err := io.Copy(os.Stdout, lr); err != sentinel {
+ log.Fatal(err)
+ }
+
+ // Output:
+ // some
+}
// LimitReader returns a Reader that reads from r
// but stops with EOF after n bytes.
// The underlying implementation is a *LimitedReader.
-func LimitReader(r Reader, n int64) Reader { return &LimitedReader{r, n} }
+func LimitReader(r Reader, n int64) Reader { return &LimitedReader{r, n, nil} }
// A LimitedReader reads from R but limits the amount of
// data returned to just N bytes. Each call to Read
// updates N to reflect the new amount remaining.
-// Read returns EOF when N <= 0 or when the underlying R returns EOF.
+// Read returns Err when N <= 0.
+// If Err is nil, it returns EOF instead.
type LimitedReader struct {
- R Reader // underlying reader
- N int64 // max bytes remaining
+ R Reader // underlying reader
+ N int64 // max bytes remaining
+ Err error // error to return on reaching the limit
}
func (l *LimitedReader) Read(p []byte) (n int, err error) {
if l.N <= 0 {
- return 0, EOF
+ err := l.Err
+ if err == nil {
+ err = EOF
+ }
+ return 0, err
}
if int64(len(p)) > l.N {
p = p[0:l.N]