diff --git a/README.md b/README.md index ca16173..ca84dec 100644 --- a/README.md +++ b/README.md @@ -113,16 +113,16 @@ in `bin/state` unless `SWWAF_STATE_DIR` is set, and the default rule file of `X-Forwarded-Proto`, and `X-Forwarded-For` with the peer added at the end. It also gets the request's id in `X-Request-ID`, the same id as in the request's log line (see `request_id` in "Request log" below). -- Enforces the timeouts and the size limits below. A limit passed before the - response has started gets `smallwebwaf`'s own answer: `408` for a client too - slow to send its request, `413` for a request body that is too large, `504` - for an app too slow to answer, and `502` for a response that is too large or - an app that cannot be reached. A request that announces a body over the limit - is refused before anything reaches the app. While a request body is still on - its way, a request timeout that runs out answers `408` if `smallwebwaf` was - waiting for the client to send more, and `504` if it was waiting for the app - to take what it had. Once the response has started, a limit can only cut the - connection. +- Enforces the timeouts and the size limits below. Once a request's line and + headers have been read, a limit passed before the response has started gets + `smallwebwaf`'s own answer: `408` for a client too slow to send its body, + `413` for a request body that is too large, `504` for an app too slow to + answer, and `502` for a response that is too large or an app that cannot be + reached. A request that announces a body over the limit is refused before + anything reaches the app. While a request body is still on its way, a request + timeout that runs out answers `408` if `smallwebwaf` was waiting for the + client to send more, and `504` if it was waiting for the app to take what it + had. Once the response has started, a limit can only cut the connection. - Counts each client's requests over a minute, an hour and a day. A request that takes the client over one of the rate limits below is refused with `SWWAF_BAN_RESPONSE`, `403` by default, before anything reaches the app, and @@ -1045,9 +1045,11 @@ less severe than `SWWAF_LOG_LEVEL` are not written. Go's HTTP server, on which `smallwebwaf` is built, reads a request's line and headers before `smallwebwaf` sees the request, and some requests end there, without a line in the log: headers over `SWWAF_CLIENT_REQUEST_HEADER_MAX_BYTES`, -which it answers `431`, headers slower than `SWWAF_CLIENT_REQUEST_TIMEOUT`, -whose connection it closes without an answer, and requests it cannot read at -all, which it answers itself, mostly with `400`. +which it answers `431`, and requests it cannot read at all, which it answers +itself, mostly with `400`. A client too slow to send its request line and +headers within `SWWAF_CLIENT_REQUEST_TIMEOUT` gets either no answer or an error +answer from the server, mostly `400 Bad Request`; either way the server closes +its connection, nothing reaches the app, and no line is written in the log. ### Sending the log to a syslog server diff --git a/SPEC.md b/SPEC.md index f84d356..428df09 100644 --- a/SPEC.md +++ b/SPEC.md @@ -414,10 +414,10 @@ The settings, by group: to send its request line and headers, and then, from the end of the headers, its body. - `SWWAF_CLIENT_REQUEST_HEADER_MAX_BYTES` (default `32K`): the largest - request line and headers a client may send. Over it, `smallwebwaf` answers - `431` and closes the connection, and nothing reaches the app. It must be - more than `4K`, and cannot be `off`: Go's HTTP server always has such a - limit, and reads 4 KiB past the one it is given before it refuses. + request line and headers a client may send. Over it, Go's HTTP server + answers `431` and closes the connection, and nothing reaches the app. It + must be more than `4K`, and cannot be `off`: Go's HTTP server always has + such a limit, and reads 4 KiB past the one it is given before it refuses. - `SWWAF_CLIENT_IDLE_TIMEOUT` (default `120s`): how long a kept-open connection may wait for its next request before `smallwebwaf` closes it. It is longer than the 90 seconds after which traefik, by default, closes a @@ -435,12 +435,13 @@ The settings, by group: the client sends it and the app receives it. - `SWWAF_RESPONSE_MAX_BYTES` (default `5G`): the largest response body, as the app sends it and the client receives it. - - 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 - client that is too slow, `502` for a response that is too large, `504` for - an app that is too slow. A request that announces a body larger than its - limit is refused before anything reaches the app. Once the response has - started it can only be cut off, and the connection is closed. + - When a limit is passed after a request's line and headers have been read, + but before the response has started, `smallwebwaf` answers itself: `413` + for a request body that is too large, `408` for a client too slow to send + its body, `502` for a response that is too large, `504` for an app that is + too slow. A request that announces a body larger than its limit is refused + before anything reaches the app. Once the 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 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 @@ -450,10 +451,11 @@ The settings, by group: waiting for the app to take what it had. - Go's HTTP server, on which `smallwebwaf` is built, reads a request's line and headers before `smallwebwaf` sees the request. A client that takes - longer than `SWWAF_CLIENT_REQUEST_TIMEOUT` to send them gets no answer: - the server closes its connection. Headers over - `SWWAF_CLIENT_REQUEST_HEADER_MAX_BYTES` are answered `431` by the server - itself. Neither request gets a line in the request log. + longer than `SWWAF_CLIENT_REQUEST_TIMEOUT` to send them gets either no + answer or an error answer from the server, mostly `400 Bad Request`; + either way the server closes its connection and nothing reaches the app. + Headers over `SWWAF_CLIENT_REQUEST_HEADER_MAX_BYTES` are answered `431` by + the server itself. Neither request gets a line in the request log. - A WebSocket connection leaves these limits behind once it is upgraded: it stays open until either side closes it. - Lookup of AS number and country (R7). On by default through GeoJS, which needs