Files
RustProxy/docs/MOCK_SERVER.md
T
2026-10-03 00:27:09 +01:00

5.1 KiB

Python-only mock origin

Run independently of Cargo/Rust, in a separate terminal:

bash dev.sh mock --port 9001 --name origin-a --ttl 30

This runs until Ctrl+C. A second origin for balancing uses another terminal:

bash dev.sh mock --port 9002 --name origin-b --ttl 30

The helper binds 127.0.0.1 by default. It accepts IPv4 addresses only and refuses non-loopback bindings without --allow-remote. Do not expose it publicly: /control deliberately has no authentication. It has 32 connection workers, 15-second socket timeout, a 2 MiB maximum response and a 10-second delay ceiling. It is a development fixture, not a secure production website.

Configure a test vhost

After building and starting RustProxy, create a vhost with domain mock.localhost, frontend 127.0.0.1:8080, backend http://127.0.0.1:9001, private backend permission, HTTP health path /health, and Cache enabled with X-Cache diagnostics. Leave sticky cookies off to test shared cache. Wait for its backend to become healthy.

examples/mock-vhost.json is a complete ready-to-apply document for a disposable installation. It explicitly enables the per-vhost cache (the 0.8.1 global default is also enabled), adds a custom 503 page, and serves the congratulations page on direct-IP access. Applying it replaces all existing routes/vhosts; it is not a merge patch. Review first:

bash dev.sh config validate examples/mock-vhost.json
bash dev.sh config apply examples/mock-vhost.json

Do not replace your real configuration for this demonstration. Use the panel to add equivalent settings to an existing project instead.

Verify cache, not just the origin

Requests must go through the proxy with the right Host:

curl -si -H 'Host: mock.localhost' http://127.0.0.1:8080/cache
curl -si -H 'Host: mock.localhost' http://127.0.0.1:8080/cache

After the first complete response, expect MISS then HIT with an identical nonce while fresh. Origin JSON always generates a new nonce and timestamp; a cache hit therefore makes reuse visible. Health probes can advance the sequence too, so compare nonce/body, not an assumption that sequence increases by exactly one. GET is the clearest fill test because it consumes the complete body. HEAD is also cacheable in 0.11.5 and shares the GET representation. Only response Vary fields create request-header representation variants; unrelated request headers and the selected backend-pool member no longer fragment the same Host + URL object.

Use the host's Purge action and request again to expect a new MISS. Waiting past TTL also refreshes. To compare with a non-cacheable route:

curl -si -H 'Host: mock.localhost' http://127.0.0.1:8080/nocache
curl -si -H 'Host: mock.localhost' http://127.0.0.1:8080/nocache

Bodies should change and must not become HIT. A diagnostic MISS means lookup was attempted, not that the response was stored: no-store/private/Set-Cookie may reject storage after origin headers arrive. BYPASS indicates a request-side exclusion.

Endpoints

Path Behavior
/ Small HTML page with links
/cache?ttl=30 Random JSON; public max-age; Vary: Accept-Language
/nocache Random JSON; no-store
/private Private JSON; cannot enter shared cache
/cookie Sets a cookie; must not enter shared cache
/large?size=131072 Compressible bytes; public freshness; useful above 65535 bytes
/slow?ms=800 Delayed no-store response
/health 200/503 according to controlled health; delay is also applied
/state Current health, delay, sequence and origin ID
/status/401, /status/403, /status/404, /status/503 Origin error responses for page tests; 401 includes a challenge
POST /control JSON with healthy:boolean and/or delay_ms:0..10000

Compression needs enabled proxy compression and an appropriate Accept-Encoding. The origin itself does not compress. Inspect both response headers and decoded body; not all curl builds support Brotli or Zstandard. Example:

curl -si --compressed -H 'Host: mock.localhost' \
  'http://127.0.0.1:8080/large?size=131072'

Failover, latency and recovery

Control the origin directly, not through the proxy, especially after it is marked down. Configure the health path /health (the default root page always returns 200).

curl -s -H 'Content-Type: application/json' -d '{"healthy":false}' http://127.0.0.1:9001/control
curl -s -H 'Content-Type: application/json' -d '{"healthy":true,"delay_ms":1200}' http://127.0.0.1:9001/control
curl -s -H 'Content-Type: application/json' -d '{"healthy":true,"delay_ms":0}' http://127.0.0.1:9001/control

Watch health/RTT in the vhost list/editor and dashboard. Fall/rise thresholds and probe interval delay transitions intentionally. Add origin-b as a second backend for failover and balancing tests. Random origin data alone does not prove that the Rust scheduler, compression or cache is correct; run the Rust acceptance tests.

Verification scope

The mock server is a development fixture, not a proxy test. Exercise its endpoints directly with curl when needed, then run the RustProxy suite separately with bash dev.sh test on a host that has Cargo.