]> Cypherpunks repositories - gostls13.git/commitdiff
bufio: Reader.Peek returns partial results on ErrBufferFull
authordjherbis <djherbis@gmail.com>
Fri, 29 Jan 2016 08:32:00 +0000 (00:32 -0800)
committerRobert Griesemer <gri@golang.org>
Fri, 4 Mar 2016 03:51:22 +0000 (03:51 +0000)
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>
src/bufio/bufio.go
src/bufio/bufio_test.go

index 7cf395c6e6d446972d6b30daffb801077f86c685..d2ccc74f5263df45bfefb0a55c2fa5685faac5c6 100644 (file)
@@ -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
index 666c44e15a938be90bb2f9095fea82a18e9401e7..d769a6aaa98d0eded670a1721d53a900f008b0cc 100644 (file)
@@ -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)