fix: report one error text when a response body is too large

This commit is contained in:
aykhans committed 2026-09-29 23:06:22 +04:00
1 parent 9d6e4e6bf8
commit a327c4978b
4 files changed
+8 -3

No files matched your search

+1 -1
View File
@@ -177,7 +177,7 @@ The value is a whole number of bytes, with or without a unit: `B`, `KB`, `MB`, `
**Examples:** `1048576`, `10MiB`, `2MB`, `512KiB` **Examples:** `1048576`, `10MiB`, `2MB`, `512KiB`
A server can declare a `Content-Length` far larger than it sends, and the body is allocated from that declared length, so without a limit a single response can exhaust memory. A response above the limit fails with `body size exceeds the given limit` and is counted like any other error. A server can declare a `Content-Length` far larger than it sends, and the body is allocated from that declared length, so without a limit a single response can exhaust memory. A response above the limit fails with `response body exceeds the body limit` and is counted like any other error.
The limit applies per response in flight, and a declared Content-Length is allocated up to it, so the worst case is a few times the limit times the concurrency. It covers the requests scripts make as well. The limit applies per response in flight, and a declared Content-Length is allocated up to it, so the worst case is a few times the limit times the concurrency. It covers the requests scripts make as well.
+1 -1
View File
@@ -159,7 +159,7 @@ func (c *scriptHTTPClient) Do(r *script.HTTPRequest) (*script.HTTPResponse, erro
} }
if err != nil { if err != nil {
if errors.Is(err, fasthttp.ErrBodyTooLarge) { if errors.Is(err, fasthttp.ErrBodyTooLarge) {
err = types.ErrScriptHTTPBodyTooLarge err = types.ErrResponseBodyTooLarge
} }
return nil, types.NewScriptHTTPRequestError(r.Method, r.URL, err) return nil, types.NewScriptHTTPRequestError(r.Method, r.URL, err)
} }
+4
View File
@@ -35,6 +35,10 @@ func statusCodeToString(code int) string {
// responseErrorKey drops the local address, whose port would mint a stats entry per connection. // responseErrorKey drops the local address, whose port would mint a stats entry per connection.
func responseErrorKey(err error) string { func responseErrorKey(err error) string {
if errors.Is(err, fasthttp.ErrBodyTooLarge) {
return types.ErrResponseBodyTooLarge.Error()
}
message := err.Error() message := err.Error()
var opErr *net.OpError var opErr *net.OpError
+2 -1
View File
@@ -17,6 +17,8 @@ var (
) )
ErrRemoteFileTooLarge = errors.New("remote file exceeds " + FormatByteSize(RemoteFetchLimit)) ErrRemoteFileTooLarge = errors.New("remote file exceeds " + FormatByteSize(RemoteFetchLimit))
ErrResponseBodyTooLarge = errors.New("response body exceeds the body limit")
) )
type FieldParseError struct { type FieldParseError struct {
@@ -415,7 +417,6 @@ var (
ErrScriptHTTPMethodEmpty = errors.New("http method cannot be empty") ErrScriptHTTPMethodEmpty = errors.New("http method cannot be empty")
ErrScriptHTTPURLInvalid = errors.New("URL must be an absolute http or https URL") ErrScriptHTTPURLInvalid = errors.New("URL must be an absolute http or https URL")
ErrScriptHTTPUnknownOption = errors.New("unknown option") ErrScriptHTTPUnknownOption = errors.New("unknown option")
ErrScriptHTTPBodyTooLarge = errors.New("response body exceeds the body limit")
ErrScriptJSONCycle = errors.New("cannot encode a table that contains itself") ErrScriptJSONCycle = errors.New("cannot encode a table that contains itself")
) )