1 Commits
Author SHA1 Message Date
sneak baa90d7625 README and SPEC say when a client too slow to send its request line or headers is answered 400 (closes #138)
check / check (push) Canceled after 0s
When SWWAF_CLIENT_REQUEST_TIMEOUT runs out partway through a line, Go's
server reads the part that arrived, a carriage return without its line
feed included, as the whole line. If that part cannot be read as a line,
it answers 400; otherwise it closes the connection without an answer.
The README's "Request log" and SPEC's size and time limits said such a
client always gets no answer, and both documents' summaries of answers
gave 408 for any slow client, when it is only for a slow body.

Model: opus-5-5
2026-10-20 11:33:51 +00:00
2 changed files with 11 additions and 9 deletions
+3 -2
View File
@@ -1047,8 +1047,9 @@ mostly with `400`, and a request line and headers slower than
`SWWAF_CLIENT_REQUEST_TIMEOUT`. When that time runs out, the server takes what `SWWAF_CLIENT_REQUEST_TIMEOUT`. When that time runs out, the server takes what
has arrived of the line it is reading for the whole line, and answers `400` if has arrived of the line it is reading for the whole line, and answers `400` if
that is not a line it can read, as for a request line cut before the end of its that is not a line it can read, as for a request line cut before the end of its
HTTP version or a header cut before its colon. Otherwise, as for a client that HTTP version, a header cut before its colon, or a line cut between its carriage
stops at the end of a line, it closes the connection without an answer. return and line feed. Otherwise, as for a client that stops right after a line
feed, it closes the connection without an answer.
### Sending the log to a syslog server ### Sending the log to a syslog server
+8 -7
View File
@@ -437,10 +437,10 @@ The settings, by group:
the app sends it and the client receives it. the app sends it and the client receives it.
- When a limit is passed before the response has started, `smallwebwaf` - When a limit is passed before the response has started, `smallwebwaf`
answers itself: `413` for a request body that is too large, `408` for a answers itself: `413` for a request body that is too large, `408` for a
client that is too slow, `502` for a response that is too large, `504` for client too slow to send its body, `502` for a response that is too large,
an app that is too slow. A request that announces a body larger than its `504` for an app that is too slow. A request that announces a body larger
limit is refused before anything reaches the app. Once the response has than its limit is refused before anything reaches the app. Once the
started it can only be cut off, and the connection is closed. response has started it can only be cut off, and the connection is closed.
- Since a request body streams through, each side can hold up the other: a - Since a request body streams through, each side can hold up the other: a
slow client slows the send to the app, and an app slow to take the body slow client slows the send to the app, and an app slow to take the body
slows the client's send. So while a request body is still on its way, a slows the client's send. So while a request body is still on its way, a
@@ -453,9 +453,10 @@ The settings, by group:
`SWWAF_CLIENT_REQUEST_TIMEOUT` runs out before they have all arrived, the `SWWAF_CLIENT_REQUEST_TIMEOUT` runs out before they have all arrived, the
server takes what has arrived of the line it is reading for the whole server takes what has arrived of the line it is reading for the whole
line, and answers `400` if that is not a line it can read, as for a line, and answers `400` if that is not a line it can read, as for a
request line cut before the end of its HTTP version or a header cut before request line cut before the end of its HTTP version, a header cut before
its colon. Otherwise, as for a client that stops at the end of a line, it its colon, or a line cut between its carriage return and line feed.
closes the connection without an answer. Headers over Otherwise, as for a client that stops right after a line feed, it closes
the connection without an answer. Headers over
`SWWAF_CLIENT_REQUEST_HEADER_MAX_BYTES` are answered `431` by the server `SWWAF_CLIENT_REQUEST_HEADER_MAX_BYTES` are answered `431` by the server
itself. None of these requests gets a line in the request log. itself. None of these requests gets a line in the request log.
- A WebSocket connection leaves these limits behind once it is upgraded: it - A WebSocket connection leaves these limits behind once it is upgraded: it