mirror of
https://github.com/golang/go.git
synced 2025-05-28 19:02:22 +00:00
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>
This commit is contained in:
parent
7047742f12
commit
14bf9c8c07
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user