aboutsummaryrefslogtreecommitdiff
path: root/src/bufio
diff options
context:
space:
mode:
authordjherbis <djherbis@gmail.com>2016-01-29 00:32:00 -0800
committerRobert Griesemer <gri@golang.org>2016-03-04 03:51:22 +0000
commit14bf9c8c07f82c4eac22a3e0f15da5cfbc30fe61 (patch)
tree77423eee3c3f365db9bd26c5ff3bc1618ee8965c /src/bufio
parent7047742f125053438b81fb3c8d33e8ad462e981e (diff)
downloadgo-14bf9c8c07f82c4eac22a3e0f15da5cfbc30fe61.tar.gz
go-14bf9c8c07f82c4eac22a3e0f15da5cfbc30fe61.zip
bufio: Reader.Peek returns partial results on ErrBufferFull
The existing implementation returns nil, ErrBufferFull when n > len(b.buf), now it will return any data in the buffer and ErrBufferFull. Fixes #14121 Change-Id: Ie52d32ccd80e4078ebfae6e75393c89675959ead Reviewed-on: https://go-review.googlesource.com/19091 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/bufio')
-rw-r--r--src/bufio/bufio.go12
-rw-r--r--src/bufio/bufio_test.go4
2 files changed, 9 insertions, 7 deletions
diff --git a/src/bufio/bufio.go b/src/bufio/bufio.go
index 7cf395c6e6..d2ccc74f52 100644
--- a/src/bufio/bufio.go
+++ b/src/bufio/bufio.go
@@ -124,14 +124,16 @@ func (b *Reader) Peek(n int) ([]byte, error) {
if n < 0 {
return nil, ErrNegativeCount
}
- if n > len(b.buf) {
- return nil, ErrBufferFull
- }
- // 0 <= n <= len(b.buf)
- for b.w-b.r < n && b.err == nil {
+
+ for b.w-b.r < n && b.w-b.r < len(b.buf) && b.err == nil {
b.fill() // b.w-b.r < len(b.buf) => buffer is not full
}
+ if n > len(b.buf) {
+ return b.buf[b.r:b.w], ErrBufferFull
+ }
+
+ // 0 <= n <= len(b.buf)
var err error
if avail := b.w - b.r; avail < n {
// not enough data in buffer
diff --git a/src/bufio/bufio_test.go b/src/bufio/bufio_test.go
index 666c44e15a..d769a6aaa9 100644
--- a/src/bufio/bufio_test.go
+++ b/src/bufio/bufio_test.go
@@ -673,8 +673,8 @@ func TestPeek(t *testing.T) {
if _, err := buf.Peek(-1); err != ErrNegativeCount {
t.Fatalf("want ErrNegativeCount got %v", err)
}
- if _, err := buf.Peek(32); err != ErrBufferFull {
- t.Fatalf("want ErrBufFull got %v", err)
+ if s, err := buf.Peek(32); string(s) != "abcdefghijklmnop" || err != ErrBufferFull {
+ t.Fatalf("want %q, ErrBufFull got %q, err=%v", "abcdefghijklmnop", string(s), err)
}
if _, err := buf.Read(p[0:3]); string(p[0:3]) != "abc" || err != nil {
t.Fatalf("want %q got %q, err=%v", "abc", string(p[0:3]), err)