Search code examples
rustrust-rocket

How to catch all routes in rocket?


I have looked up everywhere but I only found this github issue, but it's from 5 years ago, and rocket has changed a lot. Is there a way to catch all methods (get, post, head, options, whatever .. .) and all routes (/abc, /abc/xyz, /xyz, /whatever) in rocket.

I tried using the code from the github issue, but rocket api has updated a lot so I can't figure out how.


Solution

  • What you want to do is part of "manual routing" in Rocket, the code linked in the issue you found is now a dead link, but there's a similar example in the current version.
    It uses the Handler trait with its impl for functions:

    fn hi<'r>(req: &'r Request, _: Data<'r>) -> route::BoxFuture<'r> {
        route::Outcome::from(req, "Hello!").pin()
    }
    
    #[rocket::launch]
    fn rocket() -> _ {
        let hello = Route::ranked(2, Get, "/", hi);
    
        rocket::build()
            .mount("/", vec![hello])
    }
    

    If you need multiple methods you can loop through them in the same way that's described in the issue and create the routes with

    #[rocket::launch]
    fn rocket() -> _ {
        use rocket::http::Method::*;
        let mut routes = vec![];
        for method in &[Get, Put, Post, Delete, Options, Head, Trace, Connect, Patch] {
            routes.push(Route::new(*method, "/git/<path..>", git_http));
        }
        rocket::build().mount("/", routes)
    }
    

    The <path..> captures all segments (query parameters are caught by default from my testing), and you can get to them using Request's methods.