fix(maxreader): avoid hangs after reaching body limit

This commit is contained in:
wjqserver 2026-03-31 23:37:02 +08:00
parent 85cc9b5cf6
commit 91c50536c4
2 changed files with 83 additions and 32 deletions

View file

@ -11,6 +11,32 @@ import (
"testing"
)
type zeroNilThenEOFReader struct {
readCalls int
}
func (r *zeroNilThenEOFReader) Read(_ []byte) (int, error) {
r.readCalls++
if r.readCalls == 1 {
return 0, nil
}
return 0, io.EOF
}
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()
@ -63,6 +89,42 @@ func TestMaxBytesReaderRejectsOverLimit(t *testing.T) {
}
}
func TestMaxBytesReaderAllowsZeroNilThenEOFAtExactLimit(t *testing.T) {
t.Helper()
reader := NewMaxBytesReader(&zeroNilThenEOFReader{}, 1)
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)
}
n, err = reader.Read(buf)
if n != 0 || !errors.Is(err, io.EOF) {
t.Fatalf("expected EOF after retry, got n=%d err=%v", n, err)
}
}
func TestMaxBytesReaderRejectsOverLimitWithoutProbeLoop(t *testing.T) {
t.Helper()
reader := NewMaxBytesReader(&zeroNilForeverReader{}, 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)
}
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)
}
}
func TestShouldBindJSONHonorsMaxRequestBodySize(t *testing.T) {
t.Helper()