From 299a5e74f54eb70c5b2da07f727ea29f7d6a1185 Mon Sep 17 00:00:00 2001 From: takashiidobe Date: Tue, 23 Jun 2020 21:17:02 -0400 Subject: [PATCH] match path against route --- src/request.rs | 43 ++++--------------------------------------- src/rmap.rs | 12 +++++++----- 2 files changed, 11 insertions(+), 44 deletions(-) diff --git a/src/request.rs b/src/request.rs index cc2edbe63..0eef47692 100644 --- a/src/request.rs +++ b/src/request.rs @@ -140,7 +140,7 @@ impl HttpRequest { /// Checks if a given path matches a route #[inline] pub fn match_name(&self) -> Option { - self.0.rmap.match_name(&self.path()) + self.0.rmap.match_name(self.path()) } /// Request extensions @@ -478,14 +478,11 @@ mod tests { assert!(rmap.has_resource("/index.html")); - let req = TestRequest::with_uri("/test") - .header(header::HOST, "www.rust-lang.org") - .rmap(rmap) - .to_http_request(); - let route_name = req.0.rmap.match_name("index"); + let req = TestRequest::default().rmap(rmap).to_http_request(); + let route_name = req.0.rmap.match_name("/index.html"); assert_eq!( route_name.unwrap(), - rdef.name().to_owned() + "index".to_owned() ); } @@ -637,38 +634,6 @@ mod tests { assert!(tracker.borrow().dropped); } - #[actix_rt::test] - async fn test_path_routes() { - let mut srv = init_service( - App::new().service( - web::scope("/user/{id}") - .service(web::resource("/profile").route(web::get().to( - move |req: HttpRequest| { - assert_eq!( - req.0.rmap.match_name("/user/22/profile"), - Some(ResourceDef::new("/profile").name().to_owned()) - ); - - HttpResponse::Ok().finish() - }, - ))) - .default_service(web::to(move |req: HttpRequest| { - assert!(req.match_name().is_none()); - HttpResponse::Ok().finish() - })), - ), - ) - .await; - - let req = TestRequest::get().uri("/user/22/profile").to_request(); - let res = call_service(&mut srv, req).await; - assert_eq!(res.status(), StatusCode::OK); - - let req = TestRequest::get().uri("/user/22/not-exist").to_request(); - let res = call_service(&mut srv, req).await; - assert_eq!(res.status(), StatusCode::OK); - } - #[actix_rt::test] async fn extract_path_pattern() { let mut srv = init_service( diff --git a/src/rmap.rs b/src/rmap.rs index cb8476bd4..a081713b6 100644 --- a/src/rmap.rs +++ b/src/rmap.rs @@ -92,16 +92,18 @@ impl ResourceMap { } false } - /// Returns the full resource pattern matched against a route or None if no match is + /// Returns the name of the route that matches the given path or None if no match is /// found. pub fn match_name(&self, path: &str) -> Option { let path = if path.is_empty() { "/" } else { path }; - let route = self.named.get(path); - match route { - Some(route) => Some(route.name().to_string()), - None => None, + for (pattern, _) in &self.patterns { + if pattern.pattern() == path { + return Some(pattern.name().to_string()); + } } + + None } /// Returns the full resource pattern matched against a path or None if no full match