| Request gates, in order |
✓ PROVEN |
Auth, rate limiting, the WAF, IP access and the body cap are each asserted to reject before the upstream is contacted, not merely to return the right status: a counting stub stands in for the app and every denial path asserts it saw zero requests, with a control asserting an admitted one reaches it exactly once. Added in 0.4.0, and confirmed by mutation: making the auth path forward before rejecting fails the test while the client still sees the same 401. |
| Access-log query redaction |
✓ PROVEN |
A request carrying ?token=…, ?api_key=… or a bare JWT logs as <redacted>, on by default, while the same request reaches the upstream, the WAF, rate limiting and DLP unredacted. One of the integration tests puts an SQL-injection payload in a parameter named code, which is on the redaction list, so the two behaviours are proved not to interfere. |
| TLS termination |
✓ PROVEN |
TLS 1.3 negotiated, the certificate verified, the upstream response proxied back through it, plaintext refused on the TLS port, and all six hardening headers present through the tunnel. |
| Self-signed certificates |
✓ PROVEN |
self_signed = true generated a certificate on first boot, rustls loaded it, curl --cacert got 200 through it and an untrusting client was refused — so it is real TLS, not a bypass. The key file's mode is asserted 0600. What it does not do is prove identity: right for localhost, a private network or staging, wrong for a public domain, where [tls.acme] is the answer and wins when both are configured. |
| HTTP → HTTPS redirect |
✓ PROVEN |
Plaintext answered 308 to the TLS port with path and query intact; a POST followed the redirect and arrived upstream still a POST, with its body; a forged Host outside redirect_hosts got 400 and no Location; and /.well-known/acme-challenge/ got 404 rather than a redirect, because bouncing the token to the port whose certificate is being issued would deadlock the order. |
| Shared-store rate limiting |
✓ PROVEN |
Exercised across two replicas sharing one Redis. Thirty requests from one client, alternating between replicas, were allowed 5 times, the configured burst, enforced once globally against a single key. The same run with store = "local" allowed 10, which is the documented per-replica behaviour and the reason the shared store exists. |
| ACME certificate issuance |
✓ PROVEN, AND IT WAS BROKEN |
Not “untested and probably fine”: a two-year-old client could no longer parse the CA's authorization payload. Found by running it, fixed, and it now issues a real Let's Encrypt certificate in about five seconds, as CN=acme-test.eggrd.dev from a domain we control, and passes against Pebble locally. How to re-run it, and everything that was wrong. |
| WASM edge worker |
△ RUNS · NOT DEPLOYED |
Builds a deployable bundle and serves requests on workerd, the runtime Cloudflare runs in production: no credentials and a wrong password each returned 401, the correct one returned 200 from the origin carrying all six hardening headers, with Server and X-Powered-By stripped. It has not been deployed to a Cloudflare account, so routes, custom domains and secret bindings remain untested. This row stays red until that has been run. |