README and SPEC say a client too slow to send its request line and headers may get an error answer (closes #138) #145
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user