Serverless listener forwards /start to the application when basePath is "/"
Los mantenedores suelen responder en 1 día
@Saisharathchandranandnetha ya está trabajando en esto.
Desde el 19/9/2026.
- #5756 de @Saisharathchandranandnetha — abierto
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 90/100
Línea de trabajo
Comienza en rivetkit-rust/packages/rivetkit-core/src/serverless.rs, en handles_listener_request; después revisa route_path y las pruebas serverless relacionadas. Ejecuta el cargo test indicado con la reproducción de la ruta base raíz; se considera terminado cuando /, /start, /health, /metadata y /metrics están reservados, mientras que /application se reenvía a la aplicación.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
What happens
With serverless.basePath: "/" and an application passed to registry.listen(), the Rust listener forwards the engine's POST /start to the application instead of handling it. Same for /health, /metadata and /metrics. Actors on that pool never start. The same config works through registry.handler().
Where
handles_listener_request in rivetkit-rust/packages/rivetkit-core/src/serverless.rs:
let request_path = parsed.path();
if request_path != base_path && !request_path.starts_with(&format!("{base_path}/")) {
return false;
}
Why it happens
normalize_base_path(Some("/")) returns "/", so the prefix check looks for "//". No request path starts with //, so everything except / itself returns false. serverless_http.rs only hands a request to the runtime when this returns true or when there's no application, so /start ends up in the user's handler.
route_path already handles a root base path correctly. It's only this check. The TypeScript side special-cases it in isServerlessStartRequest (basePath === "/" ? "" : ...), which is why registry.handler() works.
Reproduction
Add to rivetkit-rust/packages/rivetkit-core/tests/serverless.rs:
#[test]
fn listener_reserves_framework_routes_for_root_base_path() {
let base_path = normalize_base_path(Some("/"));
for path in ["/", "/start", "/health", "/metadata", "/metrics"] {
assert!(
handles_listener_request(&base_path, &format!("http://internal{path}")),
"root base path should reserve {path}"
);
}
assert!(!handles_listener_request(&base_path, "http://internal/application"));
}
cargo test -p rivetkit-core --lib listener_reserves_framework_routes_for_root_base_path fails with root base path should reserve /start.
Expected behaviour
With a root base path the listener handles /, /start, /health, /metadata and /metrics itself and forwards everything else to the application.
Suggested fix
Treat base_path == "/" as matching every request path before the prefix check. route_path already returns the right route in that case. Happy to open a PR.
Environment
- upstream/main at
78336a1a0 - Linux 7.2.5-3-omarchy
- rustc 1.98.1 (48a229cea 2026-09-01), cargo 1.98.1 (797e8a9bc 2026-08-05)
- Lenguaje dominante
- Rust
- Estrellas
- 6.6k
- Forks
- 304
- Merge medio
- 18 h 5 min
- PR fusionados (30 d)
- 31
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de rivet-dev/rivet
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 66/100
rivet-dev/rivet#5971 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
workflow-engine: step timeout over ~24.8 days (or Infinity) fires after 1msPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
rivet-dev/rivet#5970 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
rivetkit client: ActorConn debug log prints action argumentsQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 80/100
rivet-dev/rivet#5955 · 4 comentarios ·
Los mantenedores suelen responder en 1 día
-
rivetkit 3.0: HTTP 400 overloaded on node pool upsert is treated as fatal and exits the processAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
rivet-dev/rivet#5933 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
effect: action on a missing actor instance fails as internal_error instead of actor.abortedPosiblemente ocupada @kunalgoesbyken la tomó hace 13 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
rivet-dev/rivet#5891 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de rivet-dev/rivet
Issues similares
-
ai_p2
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
ClickHouse/ClickHouse#130006 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
horizon-rust/horizon#12071 ·
Los mantenedores suelen responder en 1 día
-
bug priority: low
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
storytold/photocraft#12183 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
area:render needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
bherbruck/solvecraft#13138 ·
-
testing
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100