diff --git a/crates/http/src/routes.rs b/crates/http/src/routes.rs index e7d43e4127..62312933d7 100644 --- a/crates/http/src/routes.rs +++ b/crates/http/src/routes.rs @@ -141,6 +141,14 @@ impl Router { .map(|(_spec, handler)| (&handler.parsed_based_route, &handler.component_id)) } + /// true if one or more routes is under the reserved `/.well-known/spin/*` + /// prefix; otherwise false. + pub fn contains_reserved_route(&self) -> bool { + self.router + .iter() + .any(|(_spec, handker)| handker.based_route.starts_with(crate::WELL_KNOWN_PREFIX)) + } + /// This returns the component ID that should handle the given path, or an error /// if no component matches. /// @@ -593,4 +601,30 @@ mod route_tests { let m = routes.route("/1/2/3").expect("/1/2/3 should have matched"); assert_eq!("2", m.named_wildcards()["two"]); } + + #[test] + fn reserved_routes_are_reserved() { + let (routes, _dups) = + Router::build("/", vec![("comp", &"/.well-known/spin/...".into())]).unwrap(); + assert!(routes.contains_reserved_route()); + + let (routes, _dups) = + Router::build("/", vec![("comp", &"/.well-known/spin/fie".into())]).unwrap(); + assert!(routes.contains_reserved_route()); + } + + #[test] + fn unreserved_routes_are_unreserved() { + let (routes, _dups) = + Router::build("/", vec![("comp", &"/.well-known/spindle/...".into())]).unwrap(); + assert!(!routes.contains_reserved_route()); + + let (routes, _dups) = + Router::build("/", vec![("comp", &"/.well-known/spi/...".into())]).unwrap(); + assert!(!routes.contains_reserved_route()); + + let (routes, _dups) = + Router::build("/", vec![("comp", &"/.well-known/spin".into())]).unwrap(); + assert!(!routes.contains_reserved_route()); + } } diff --git a/crates/trigger-http/src/server.rs b/crates/trigger-http/src/server.rs index 0d0747c52b..57782e8b88 100644 --- a/crates/trigger-http/src/server.rs +++ b/crates/trigger-http/src/server.rs @@ -90,6 +90,12 @@ impl HttpServer { ); } } + if router.contains_reserved_route() { + tracing::error!( + "Routes under {} are handled by the Spin runtime and will never be reached", + spin_http::WELL_KNOWN_PREFIX + ); + } tracing::trace!( "Constructed router: {:?}", router.routes().collect::>()