diff --git a/core/codegen/tests/segment-ignore.rs b/core/codegen/tests/segment-ignore.rs new file mode 100644 index 00000000..ee2fb108 --- /dev/null +++ b/core/codegen/tests/segment-ignore.rs @@ -0,0 +1,54 @@ +#[macro_use] +extern crate rocket; + +#[get("/<_>", rank = 1)] fn ig_1() -> &'static str { "1" } + +#[get("/static")] fn just_static() -> &'static str { "static" } + +#[get("/<_>/<_>", rank = 1)] fn ig_2() -> &'static str { "2" } + +#[get("/static/<_>")] fn ig_1_static() -> &'static str { "static_1" } + +#[get("/<_>/<_>/<_>", rank = 1)] fn ig_3() -> &'static str { "3" } + +#[get("/static/<_>/static")] fn ig_1_static_static() -> &'static str { "static_1_static" } + +#[get("//<_>/<_>/")] fn wrapped(a: String, b: String) -> String { a + &b } + +#[test] +fn test_ignored_segments() { + use rocket::local::blocking::Client; + + fn get_string(client: &Client, url: &str) -> String { + client.get(url).dispatch().into_string().unwrap() + } + + let rocket = rocket::ignite().mount("/", routes![ + ig_1, just_static, ig_2, ig_3, ig_1_static, ig_1_static_static, wrapped + ]); + + let client = match Client::untracked(rocket) { + Ok(client) => client, + Err(e) => { drop(e); panic!("whoops") }, + }; + + assert_eq!(get_string(&client, "/foo"), "1"); + assert_eq!(get_string(&client, "/bar"), "1"); + assert_eq!(get_string(&client, "/static"), "static"); + + assert_eq!(get_string(&client, "/foo/bar"), "2"); + assert_eq!(get_string(&client, "/bar/foo"), "2"); + assert_eq!(get_string(&client, "/a/b"), "2"); + assert_eq!(get_string(&client, "/foo/static"), "2"); + assert_eq!(get_string(&client, "/static/foo"), "static_1"); + + assert_eq!(get_string(&client, "/foo/bar/baz"), "3"); + assert_eq!(get_string(&client, "/bar/static/bam"), "3"); + assert_eq!(get_string(&client, "/static/static/static"), "static_1_static"); + assert_eq!(get_string(&client, "/static/foo/bam"), "3"); + + assert_eq!(get_string(&client, "/a/b/c/d"), "ad"); + assert_eq!(get_string(&client, "/static/b/c/static"), "staticstatic"); + assert_eq!(get_string(&client, "/a/b/c/static"), "astatic"); + assert_eq!(get_string(&client, "/ec/b/c/static"), "ecstatic"); +} diff --git a/core/codegen/tests/ui-fail-nightly/bad-ignored-segments.rs b/core/codegen/tests/ui-fail-nightly/bad-ignored-segments.rs new file mode 120000 index 00000000..990d50d9 --- /dev/null +++ b/core/codegen/tests/ui-fail-nightly/bad-ignored-segments.rs @@ -0,0 +1 @@ +../ui-fail/bad-ignored-segments.rs \ No newline at end of file diff --git a/core/codegen/tests/ui-fail-nightly/bad-ignored-segments.stderr b/core/codegen/tests/ui-fail-nightly/bad-ignored-segments.stderr new file mode 100644 index 00000000..29929953 --- /dev/null +++ b/core/codegen/tests/ui-fail-nightly/bad-ignored-segments.stderr @@ -0,0 +1,15 @@ +error: parameter must be named + --> $DIR/bad-ignored-segments.rs:6:11 + | +6 | #[get("/c?<_>")] + | ^^^ + | + = help: use a name such as `_guard` or `_param` + +error: parameter must be named + --> $DIR/bad-ignored-segments.rs:9:22 + | +9 | #[post("/d", data = "<_>")] + | ^^^ + | + = help: use a name such as `_guard` or `_param` diff --git a/core/codegen/tests/ui-fail-stable/bad-ignored-segments.rs b/core/codegen/tests/ui-fail-stable/bad-ignored-segments.rs new file mode 120000 index 00000000..990d50d9 --- /dev/null +++ b/core/codegen/tests/ui-fail-stable/bad-ignored-segments.rs @@ -0,0 +1 @@ +../ui-fail/bad-ignored-segments.rs \ No newline at end of file diff --git a/core/codegen/tests/ui-fail-stable/bad-ignored-segments.stderr b/core/codegen/tests/ui-fail-stable/bad-ignored-segments.stderr new file mode 100644 index 00000000..423c7105 --- /dev/null +++ b/core/codegen/tests/ui-fail-stable/bad-ignored-segments.stderr @@ -0,0 +1,13 @@ +error: parameter must be named + --- help: use a name such as `_guard` or `_param` + --> $DIR/bad-ignored-segments.rs:6:7 + | +6 | #[get("/c?<_>")] + | ^^^^^^^^ + +error: parameter must be named + --- help: use a name such as `_guard` or `_param` + --> $DIR/bad-ignored-segments.rs:9:21 + | +9 | #[post("/d", data = "<_>")] + | ^^^^^ diff --git a/core/codegen/tests/ui-fail/bad-ignored-segments.rs b/core/codegen/tests/ui-fail/bad-ignored-segments.rs new file mode 100644 index 00000000..270344d3 --- /dev/null +++ b/core/codegen/tests/ui-fail/bad-ignored-segments.rs @@ -0,0 +1,12 @@ +#[macro_use] extern crate rocket; + +#[get("/<_>")] +fn i0() {} + +#[get("/c?<_>")] +fn i1() {} + +#[post("/d", data = "<_>")] +fn i2() {} + +fn main() { } diff --git a/core/lib/src/router/mod.rs b/core/lib/src/router/mod.rs index cb42aeac..85383943 100644 --- a/core/lib/src/router/mod.rs +++ b/core/lib/src/router/mod.rs @@ -159,6 +159,12 @@ mod test { assert!(unranked_route_collisions(&["/a/", "/a/"])); assert!(unranked_route_collisions(&["/a/b/", "/a/"])); assert!(unranked_route_collisions(&["/a/b/c/d", "/a/"])); + assert!(unranked_route_collisions(&["/<_>", "/<_>"])); + assert!(unranked_route_collisions(&["/a/<_>", "/a/b"])); + assert!(unranked_route_collisions(&["/a/<_>", "/a/"])); + assert!(unranked_route_collisions(&["/<_..>", "/a/b"])); + assert!(unranked_route_collisions(&["/<_..>", "/<_>"])); + assert!(unranked_route_collisions(&["/<_>/b", "/a/b"])); } #[test] @@ -175,6 +181,11 @@ mod test { assert!(unranked_route_collisions(&["/a//", "/a/bd/e/"])); assert!(unranked_route_collisions(&["/a///", "/a/b//c//d/e/"])); assert!(unranked_route_collisions(&["/a////", "/a/b//c//d/e/"])); + assert!(unranked_route_collisions(&["///<_>", "/<_>"])); + assert!(unranked_route_collisions(&["/a/<_>", "///a//b"])); + assert!(unranked_route_collisions(&["//a///<_>", "/a//"])); + assert!(unranked_route_collisions(&["//<_..>", "/a/b"])); + assert!(unranked_route_collisions(&["//<_..>", "/<_>"])); } #[test] @@ -197,6 +208,11 @@ mod test { assert!(!unranked_route_collisions(&["/a/b/c/d", "/a/b/c//e"])); assert!(!unranked_route_collisions(&["/a/d/", "/a/b/c"])); assert!(!unranked_route_collisions(&["/a/d/", "/a/d"])); + assert!(!unranked_route_collisions(&["/<_>", "/"])); + assert!(!unranked_route_collisions(&["/a/<_>", "/a"])); + assert!(!unranked_route_collisions(&["/a/<_..>", "/a"])); + assert!(!unranked_route_collisions(&["/a/<_..>", "/<_>"])); + assert!(!unranked_route_collisions(&["/a/<_>", "/<_>"])); } #[test] @@ -207,6 +223,9 @@ mod test { assert!(!default_rank_route_collisions(&["/hi", "/"])); assert!(!default_rank_route_collisions(&["/hi", "/"])); assert!(!default_rank_route_collisions(&["/a/b", "/a/b/"])); + assert!(!default_rank_route_collisions(&["/<_>", "/static"])); + assert!(!default_rank_route_collisions(&["/<_>/<_>", "/foo/bar"])); + assert!(!default_rank_route_collisions(&["/foo/<_>", "/foo/bar"])); } #[test]