diff options
| author | 2026-03-04 08:26:56 +0800 | |
|---|---|---|
| committer | 2026-03-04 08:59:53 +0800 | |
| commit | ab7501be34032fb9e5c48726a68ae90a917af9eb (patch) | |
| tree | 20d005647569befea8133e953c3270e8fd2a2a5b /internal/iolimit | |
| parent | *: gofumpt (diff) | |
| signature | No signature | |
*: Lint
Diffstat (limited to 'internal/iolimit')
| -rw-r--r-- | internal/iolimit/expect_length_reader.go | 5 | ||||
| -rw-r--r-- | internal/iolimit/expect_length_reader_test.go | 8 |
2 files changed, 13 insertions, 0 deletions
diff --git a/internal/iolimit/expect_length_reader.go b/internal/iolimit/expect_length_reader.go index 477c207f..288e0e62 100644 --- a/internal/iolimit/expect_length_reader.go +++ b/internal/iolimit/expect_length_reader.go @@ -39,13 +39,16 @@ func (reader *expectLengthReader) Read(dst []byte) (int, error) { if reader.remaining == 0 { var probe [1]byte + n, err := reader.src.Read(probe[:]) if n > 0 { return 0, ErrExpectedLengthExceeded } + if err == nil { return 0, nil } + return 0, err } @@ -66,9 +69,11 @@ func (reader *expectLengthReader) Read(dst []byte) (int, error) { if reader.remaining > 0 { return n, io.ErrUnexpectedEOF } + if n > 0 { return n, nil } + return 0, io.EOF } diff --git a/internal/iolimit/expect_length_reader_test.go b/internal/iolimit/expect_length_reader_test.go index 503c88ed..e2cfeab0 100644 --- a/internal/iolimit/expect_length_reader_test.go +++ b/internal/iolimit/expect_length_reader_test.go @@ -13,15 +13,18 @@ func TestExpectLengthReaderExact(t *testing.T) { t.Parallel() r := iolimit.ExpectLengthReader(bytes.NewReader([]byte("hello")), 5) + got, err := io.ReadAll(r) if err != nil { t.Fatalf("ReadAll error: %v", err) } + if !bytes.Equal(got, []byte("hello")) { t.Fatalf("ReadAll = %q, want %q", got, "hello") } buf := make([]byte, 1) + n, err := r.Read(buf) if n != 0 || !errors.Is(err, io.EOF) { t.Fatalf("post-boundary Read = (%d,%v), want (0,EOF)", n, err) @@ -32,6 +35,7 @@ func TestExpectLengthReaderShort(t *testing.T) { t.Parallel() r := iolimit.ExpectLengthReader(bytes.NewReader([]byte("hey")), 5) + _, err := io.ReadAll(r) if !errors.Is(err, io.ErrUnexpectedEOF) { t.Fatalf("ReadAll error = %v, want ErrUnexpectedEOF", err) @@ -43,15 +47,18 @@ func TestExpectLengthReaderLongDetectedOnNextRead(t *testing.T) { r := iolimit.ExpectLengthReader(bytes.NewReader([]byte("hello!")), 5) buf := make([]byte, 5) + n, err := io.ReadFull(r, buf) if err != nil { t.Fatalf("ReadFull error: %v", err) } + if n != 5 || !bytes.Equal(buf, []byte("hello")) { t.Fatalf("ReadFull = (%d,%q), want (5,hello)", n, buf) } probe := make([]byte, 1) + n, err = r.Read(probe) if n != 0 || !errors.Is(err, iolimit.ErrExpectedLengthExceeded) { t.Fatalf("overflow Read = (%d,%v), want (0,ErrExpectedLengthExceeded)", n, err) @@ -63,6 +70,7 @@ func TestExpectLengthReaderEmptyExpected(t *testing.T) { r := iolimit.ExpectLengthReader(bytes.NewReader(nil), 0) buf := make([]byte, 1) + n, err := r.Read(buf) if n != 0 || !errors.Is(err, io.EOF) { t.Fatalf("Read = (%d,%v), want (0,EOF)", n, err) |
