Skip to content

Commit fd6ef06

Browse files
earthboundkidgopherbot
authored andcommitted
io: add an Err field to LimitedReader
Fixes #51115 Change-Id: I3c5296e4adc71c1c1b1808a45abd4801ae43465a GitHub-Last-Rev: 4c197ac GitHub-Pull-Request: #51990 Reviewed-on: https://go-review.googlesource.com/c/go/+/396215 Reviewed-by: Dmitri Shuralyov <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent 037b209 commit fd6ef06

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

api/next/51115.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pkg io, type LimitedReader struct, Err error #51115

src/io/example_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package io_test
66

77
import (
88
"bytes"
9+
"errors"
910
"fmt"
1011
"io"
1112
"log"
@@ -283,3 +284,16 @@ func ExampleReadAll() {
283284
// Output:
284285
// Go is a general-purpose language designed with systems programming in mind.
285286
}
287+
288+
func ExampleLimitedReader() {
289+
r := strings.NewReader("some io.Reader stream to be read\n")
290+
sentinel := errors.New("reached read limit")
291+
lr := &io.LimitedReader{R: r, N: 4, Err: sentinel}
292+
293+
if _, err := io.Copy(os.Stdout, lr); err != sentinel {
294+
log.Fatal(err)
295+
}
296+
297+
// Output:
298+
// some
299+
}

src/io/io.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -455,20 +455,26 @@ func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
455455
// LimitReader returns a Reader that reads from r
456456
// but stops with EOF after n bytes.
457457
// The underlying implementation is a *LimitedReader.
458-
func LimitReader(r Reader, n int64) Reader { return &LimitedReader{r, n} }
458+
func LimitReader(r Reader, n int64) Reader { return &LimitedReader{r, n, nil} }
459459

460460
// A LimitedReader reads from R but limits the amount of
461461
// data returned to just N bytes. Each call to Read
462462
// updates N to reflect the new amount remaining.
463-
// Read returns EOF when N <= 0 or when the underlying R returns EOF.
463+
// Read returns Err when N <= 0.
464+
// If Err is nil, it returns EOF instead.
464465
type LimitedReader struct {
465-
R Reader // underlying reader
466-
N int64 // max bytes remaining
466+
R Reader // underlying reader
467+
N int64 // max bytes remaining
468+
Err error // error to return on reaching the limit
467469
}
468470

469471
func (l *LimitedReader) Read(p []byte) (n int, err error) {
470472
if l.N <= 0 {
471-
return 0, EOF
473+
err := l.Err
474+
if err == nil {
475+
err = EOF
476+
}
477+
return 0, err
472478
}
473479
if int64(len(p)) > l.N {
474480
p = p[0:l.N]

0 commit comments

Comments
 (0)