From 187646b2f9900ec56cbec6b4d1b168b1d0e78058 Mon Sep 17 00:00:00 2001 From: Rob Ede Date: Sun, 9 Aug 2020 15:51:38 +0100 Subject: [PATCH] match HttpRequest app_data behavior in ServiceRequest (#1618) --- CHANGES.md | 3 +++ src/service.rs | 32 ++++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index d80e8794..adc34305 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,8 @@ using `App::data`. [#1610] * `web::Path` now has a public representation: `web::Path(pub T)` that enables destructuring. [#1594] +* `ServiceRequest::app_data` allows retrieval of non-Data data without splitting into parts to + access `HttpRequest` which already allows this. [#1618] * MSRV is now 1.42.0. ### Fixed @@ -14,6 +16,7 @@ [#1594]: https://github.com/actix/actix-web/pull/1594 [#1609]: https://github.com/actix/actix-web/pull/1609 [#1610]: https://github.com/actix/actix-web/pull/1610 +[#1618]: https://github.com/actix/actix-web/pull/1610 ## 3.0.0-beta.1 - 2020-07-13 diff --git a/src/service.rs b/src/service.rs index cba852a9..a861ba38 100644 --- a/src/service.rs +++ b/src/service.rs @@ -12,7 +12,6 @@ use actix_router::{IntoPattern, Path, Resource, ResourceDef, Url}; use actix_service::{IntoServiceFactory, ServiceFactory}; use crate::config::{AppConfig, AppService}; -use crate::data::Data; use crate::dev::insert_slash; use crate::guard::Guard; use crate::info::ConnectionInfo; @@ -226,12 +225,11 @@ impl ServiceRequest { self.0.app_config() } - /// Get an application data stored with `App::data()` method during - /// application configuration. - pub fn app_data(&self) -> Option> { + /// Counterpart to [`HttpRequest::app_data`](../struct.HttpRequest.html#method.app_data). + pub fn app_data(&self) -> Option<&T> { for container in (self.0).0.app_data.iter().rev() { - if let Some(data) = container.get::>() { - return Some(Data::clone(&data)); + if let Some(data) = container.get::() { + return Some(data); } } @@ -595,6 +593,28 @@ mod tests { let resp = srv.call(req).await.unwrap(); assert_eq!(resp.status(), http::StatusCode::NOT_FOUND); } + + #[actix_rt::test] + async fn test_service_data() { + let mut srv = init_service( + App::new() + .data(42u32) + .service(web::service("/test").name("test").finish( + |req: ServiceRequest| { + assert_eq!( + req.app_data::>().unwrap().as_ref(), + &42 + ); + ok(req.into_response(HttpResponse::Ok().finish())) + }, + )), + ) + .await; + let req = TestRequest::with_uri("/test").to_request(); + let resp = srv.call(req).await.unwrap(); + assert_eq!(resp.status(), http::StatusCode::OK); + } + #[test] fn test_fmt_debug() { let req = TestRequest::get()