Rocket/core/lib/tests/segments-issues-41-86.rs
Sergio Benitez fa3e0334c1 Overhaul URI types, parsers, 'uri!' macro.
This commit entirely rewrites Rocket's URI parsing routines and
overhauls the 'uri!' macro resolving all known issues and removing any
potential limitations for compile-time URI creation. This commit:

  * Introduces a new 'Reference' URI variant for URI-references.
  * Modifies 'Redirect' to accept 'TryFrom<Reference>'.
  * Introduces a new 'Asterisk' URI variant for parity.
  * Allows creation of any URI type from a string literal via 'uri!'.
  * Enables dynamic/static prefixing/suffixing of route URIs in 'uri!'.
  * Unifies 'Segments' and 'QuerySegments' into one generic 'Segments'.
  * Consolidates URI formatting types/traits into a 'uri::fmt' module.
  * Makes APIs more symmetric across URI types.

It also includes the following less-relevant changes:

  * Implements 'FromParam' for a single-segment 'PathBuf'.
  * Adds 'FileName::is_safe()'.
  * No longer reparses upstream request URIs.

Resolves #842.
Resolves #853.
Resolves #998.
2021-05-19 18:47:11 -07:00

53 lines
1.6 KiB
Rust

#[macro_use] extern crate rocket;
use rocket::http::uri::{Segments, fmt::Path};
#[get("/test/<path..>")]
fn test(path: Segments<'_, Path>) -> String {
path.collect::<Vec<_>>().join("/")
}
#[get("/two/<path..>")]
fn two(path: Segments<'_, Path>) -> String {
path.collect::<Vec<_>>().join("/")
}
#[get("/one/two/<path..>")]
fn one_two(path: Segments<'_, Path>) -> String {
path.collect::<Vec<_>>().join("/")
}
#[get("/<path..>", rank = 2)]
fn none(path: Segments<'_, Path>) -> String {
path.collect::<Vec<_>>().join("/")
}
#[get("/static/<user>/is/<path..>")]
fn dual(user: String, path: Segments<'_, Path>) -> String {
user + "/is/" + &path.collect::<Vec<_>>().join("/")
}
mod tests {
use super::*;
use rocket::local::blocking::Client;
#[test]
fn segments_works() {
let rocket = rocket::build()
.mount("/", routes![test, two, one_two, none, dual])
.mount("/point", routes![test, two, one_two, dual]);
let client = Client::debug(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 response = client.get(format!("{}/{}", prefix, path)).dispatch();
assert_eq!(response.into_string(), Some(path.into()));
}
}
}