#![feature(proc_macro_hygiene, async_await)] #[macro_use] extern crate rocket; use rocket::http::uri::Segments; #[get("/test/")] fn test(path: Segments<'_>) -> String { path.collect::>().join("/") } #[get("/two/")] fn two(path: Segments<'_>) -> String { path.collect::>().join("/") } #[get("/one/two/")] fn one_two(path: Segments<'_>) -> String { path.collect::>().join("/") } #[get("/", rank = 2)] fn none(path: Segments<'_>) -> String { path.collect::>().join("/") } #[get("/static//is/")] fn dual(user: String, path: Segments<'_>) -> String { user + "/is/" + &path.collect::>().join("/") } mod tests { use super::*; use rocket::local::Client; #[test] fn segments_works() { let rocket = rocket::ignite() .mount("/", routes![test, two, one_two, none, dual]) .mount("/point", routes![test, two, one_two, dual]); let client = Client::new(rocket).unwrap(); // We construct a path that matches each of the routes above. We ensure the // prefix is stripped, confirming that dynamic segments are working. for prefix in &["", "/test", "/two", "/one/two", "/point/test", "/point/two", "/point/one/two", "/static", "/point/static"] { let path = "this/is/the/path/we/want"; let mut response = client.get(format!("{}/{}", prefix, path)).dispatch(); assert_eq!(response.body_string_wait(), Some(path.into())); } } }