Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
31cfa8f
docs: design doc for HTTP path-based routing + redirects (#137)
antoncxx Aug 7, 2026
7f8869f
docs: add worked example to HTTP routing design doc
antoncxx Aug 7, 2026
275a2ad
grpc: add HttpRoute/HttpRedirect/HttpRouteBundle + WatchHttpRoutes RPC
antoncxx Aug 7, 2026
64356fe
server: HTTP path-based route config, validation, and distribution (#…
antoncxx Aug 7, 2026
b387406
proxy: dispatch HTTP requests through the (host, path) route table (#…
antoncxx Aug 7, 2026
039a448
ui: add a Routes page for configuring HTTP path routing/redirects (#137)
antoncxx Aug 7, 2026
65f9d62
docs: mark HTTP path-routing design as implemented
antoncxx Aug 7, 2026
baabee8
server: add explicit backward-compat tests for route-less configs
antoncxx Aug 7, 2026
6f89fc1
grpc: add strip_prefix/preserve_path/preserve_query to HTTP routes (#…
antoncxx Aug 7, 2026
95c861f
server: validate and wire strip_prefix/preserve_path/preserve_query (…
antoncxx Aug 7, 2026
b607dec
proxy: apply strip_prefix/preserve_path/preserve_query (#137)
antoncxx Aug 7, 2026
085e9d3
docs: document strip_prefix/preserve_path/preserve_query additions
antoncxx Aug 7, 2026
dc04b26
ui: expose strip_prefix/preserve_path/preserve_query in the Routes form
antoncxx Aug 7, 2026
2cb6b75
docs: mark admin UI form support for the path-rewrite fields as done
antoncxx Aug 7, 2026
470dcc2
Merge remote-tracking branch 'origin/main' into feature/proxy-redirec…
antoncxx Aug 10, 2026
01e7b77
docs+ui: close Gate 4 gaps for route_conflict and [[route]] config
antoncxx Aug 10, 2026
d022432
grpc: silence clippy double_must_use on the generated server trait
antoncxx Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ tokio = "1.51.1"
serde = "1.0.228"
serde_json = "1.0"
toml = "1.1.2"
toml_edit = "0.23"
chrono = "0.4.44"
gag = "1.0.0"
ipnetwork = "0.21.1"
Expand Down
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,31 @@ The repository should be cloned under `/root` so the provided `setup-*.sh` scrip
Only valid on a service with a `timeout` (an entry point) — the server rejects an ingress policy
on a backend-only service.

- `[[route]]` blocks add NGINX-`location`-style HTTP dispatch on top of `[[services]]`, matching by
`host` + prefix `path` (defaults to `/`) rather than by `Host` header alone:
```
[[route]] # forward to a backend, stripping the matched prefix
host = "ops.example.com"
path = "/api"
service = "api.internal" # must be an in-stack, http-protocol, proxy-reachable service
strip_prefix = true # "api" sees "/users", not "/api/users"

[[route]] # redirect, no backend needed
host = "old.example.com"
path = "/old"
redirect_to = "/new"
redirect_status = 301 # optional, defaults to 301; one of 301/302/307/308
preserve_path = true # /old/x?foo=bar -> /new/x?foo=bar
preserve_query = true
```
`service` and `redirect_to` are mutually exclusive (exactly one required per route);
`strip_prefix` only applies to `service` routes, `preserve_path`/`preserve_query` only to
`redirect_to` routes — each is rejected on the wrong kind. All four flags default to `false`, so
a stack with no `[[route]]` blocks keeps today's plain per-service `Host`-header routing. A given
`(host, path)` pair must be claimed by exactly one route across every stack — a collision (even
within the same stack) is a hard config error, reported as a `route_conflict` event. Configurable
from the admin UI's Routes page as well as by editing the TOML directly.

- run the project as a daemon (from the repo root)
```
./setup-server.sh
Expand Down
Loading