diff options
| author | Carl Johnson <me@carlmjohnson.net> | 2022-03-28 18:49:05 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-05-04 20:06:32 +0000 |
| commit | fd6ef06296b55a234d4fd5ebf5dd3e5bfd8f4e25 (patch) | |
| tree | cde0c854019935c9d7ff800668779fca798e7236 /src/io | |
| parent | 037b209ae3e0453004a4d57e152aa522c56f79e4 (diff) | |
| download | go-fd6ef06296b55a234d4fd5ebf5dd3e5bfd8f4e25.tar.xz | |
io: add an Err field to LimitedReader
Fixes #51115
Change-Id: I3c5296e4adc71c1c1b1808a45abd4801ae43465a
GitHub-Last-Rev: 4c197acd51e1cac051302deba57b97da66e004e1
GitHub-Pull-Request: golang/go#51990
Reviewed-on: https://go-review.googlesource.com/c/go/+/396215
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Diffstat (limited to 'src/io')
| -rw-r--r-- | src/io/example_test.go | 14 | ||||
| -rw-r--r-- | src/io/io.go | 16 |
2 files changed, 25 insertions, 5 deletions
diff --git a/src/io/example_test.go b/src/io/example_test.go index 419e449982..e4b20bd981 100644 --- a/src/io/example_test.go +++ b/src/io/example_test.go @@ -6,6 +6,7 @@ package io_test import ( "bytes" + "errors" "fmt" "io" "log" @@ -283,3 +284,16 @@ func ExampleReadAll() { // 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 +} diff --git a/src/io/io.go b/src/io/io.go index db88125f50..830779e79d 100644 --- a/src/io/io.go +++ b/src/io/io.go @@ -455,20 +455,26 @@ func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) { // 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] |
