diff --git a/context_bodylimit_test.go b/context_bodylimit_test.go index 37f5e46..1e7696a 100644 --- a/context_bodylimit_test.go +++ b/context_bodylimit_test.go @@ -27,16 +27,6 @@ func (r *zeroNilThenEOFReader) Close() error { return nil } -type zeroNilForeverReader struct{} - -func (r *zeroNilForeverReader) Read(_ []byte) (int, error) { - return 0, nil -} - -func (r *zeroNilForeverReader) Close() error { - return nil -} - func TestFileTextUsesProvidedStatusCode(t *testing.T) { t.Helper() @@ -107,21 +97,18 @@ func TestMaxBytesReaderAllowsZeroNilThenEOFAtExactLimit(t *testing.T) { } } -func TestMaxBytesReaderRejectsOverLimitWithoutProbeLoop(t *testing.T) { +func TestMaxBytesReaderTreatsZeroLimitAsUnlimited(t *testing.T) { t.Helper() - reader := NewMaxBytesReader(&zeroNilForeverReader{}, 0) + reader := NewMaxBytesReader(io.NopCloser(strings.NewReader("abc")), 0) defer reader.Close() - buf := make([]byte, 1) - n, err := reader.Read(buf) - if n != 0 || err != nil { - t.Fatalf("expected initial zero,nil read result, got n=%d err=%v", n, err) + data, err := io.ReadAll(reader) + if err != nil { + t.Fatalf("expected zero limit to leave body unlimited, got %v", err) } - - n, err = reader.Read(buf) - if n != 0 || !errors.Is(err, ErrBodyTooLarge) { - t.Fatalf("expected ErrBodyTooLarge after repeated zero,nil reads, got n=%d err=%v", n, err) + if string(data) != "abc" { + t.Fatalf("unexpected data: %q", string(data)) } } diff --git a/maxreader.go b/maxreader.go index 8191853..4d3fb2c 100644 --- a/maxreader.go +++ b/maxreader.go @@ -31,13 +31,13 @@ type maxBytesReader struct { // 但在读取的字节数超过 n 后会返回 ErrBodyTooLarge 错误. // // 如果 r 为 nil, 会 panic. -// 如果 n 小于 0, 则读取不受限制, 直接返回原始的 r. +// 如果 n 小于等于 0, 则读取不受限制, 直接返回原始的 r. func NewMaxBytesReader(r io.ReadCloser, n int64) io.ReadCloser { if r == nil { panic("NewMaxBytesReader called with a nil reader") } - // 如果限制为负数, 意味着不限制, 直接返回原始的 ReadCloser. - if n < 0 { + // 如果限制为非正数, 意味着不限制, 直接返回原始的 ReadCloser. + if n <= 0 { return r } return &maxBytesReader{