diff --git a/src/header/common/mod.rs b/src/header/common/mod.rs index e86bf896f..08f8e0cc4 100644 --- a/src/header/common/mod.rs +++ b/src/header/common/mod.rs @@ -74,8 +74,6 @@ macro_rules! test_header { ($id:ident, $raw:expr) => { #[test] fn $id() { - #[allow(unused, deprecated)] - use std::ascii::AsciiExt; use test; let raw = $raw; let a: Vec> = raw.iter().map(|x| x.to_vec()).collect(); diff --git a/src/header/shared/charset.rs b/src/header/shared/charset.rs index 21ee637b5..540dc4f28 100644 --- a/src/header/shared/charset.rs +++ b/src/header/shared/charset.rs @@ -1,5 +1,3 @@ -#![allow(unused, deprecated)] -use std::ascii::AsciiExt; use std::fmt::{self, Display}; use std::str::FromStr; diff --git a/src/header/shared/quality_item.rs b/src/header/shared/quality_item.rs index a9488e81f..80bd7e1c2 100644 --- a/src/header/shared/quality_item.rs +++ b/src/header/shared/quality_item.rs @@ -1,5 +1,3 @@ -#![allow(unused, deprecated)] -use std::ascii::AsciiExt; use std::cmp; use std::default::Default; use std::fmt; diff --git a/src/route.rs b/src/route.rs index 040baa2d6..3039d0896 100644 --- a/src/route.rs +++ b/src/route.rs @@ -17,7 +17,7 @@ use middleware::{ Started as MiddlewareStarted, }; use pred::Predicate; -use with::{ExtractorConfig, With, With2, With3, WithAsync}; +use with::{ExtractorConfig, With, WithAsync}; /// Resource route definition /// @@ -216,85 +216,6 @@ impl Route { self.h(WithAsync::new(handler, Clone::clone(&cfg))); cfg } - - #[doc(hidden)] - /// Set handler function, use request extractor for both parameters. - /// - /// ```rust - /// # extern crate bytes; - /// # extern crate actix_web; - /// # extern crate futures; - /// #[macro_use] extern crate serde_derive; - /// use actix_web::{http, App, Path, Query, Result}; - /// - /// #[derive(Deserialize)] - /// struct PParam { - /// username: String, - /// } - /// - /// #[derive(Deserialize)] - /// struct QParam { - /// count: u32, - /// } - /// - /// /// extract path and query information using serde - /// fn index(p: Path, q: Query) -> Result { - /// Ok(format!("Welcome {}!", p.username)) - /// } - /// - /// fn main() { - /// let app = App::new().resource( - /// "/{username}/index.html", // <- define path parameters - /// |r| r.method(http::Method::GET).with2(index), - /// ); // <- use `with` extractor - /// } - /// ``` - pub fn with2( - &mut self, handler: F, - ) -> (ExtractorConfig, ExtractorConfig) - where - F: Fn(T1, T2) -> R + 'static, - R: Responder + 'static, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - { - let cfg1 = ExtractorConfig::default(); - let cfg2 = ExtractorConfig::default(); - self.h(With2::new( - handler, - Clone::clone(&cfg1), - Clone::clone(&cfg2), - )); - (cfg1, cfg2) - } - - #[doc(hidden)] - /// Set handler function, use request extractor for all parameters. - pub fn with3( - &mut self, handler: F, - ) -> ( - ExtractorConfig, - ExtractorConfig, - ExtractorConfig, - ) - where - F: Fn(T1, T2, T3) -> R + 'static, - R: Responder + 'static, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - T3: FromRequest + 'static, - { - let cfg1 = ExtractorConfig::default(); - let cfg2 = ExtractorConfig::default(); - let cfg3 = ExtractorConfig::default(); - self.h(With3::new( - handler, - Clone::clone(&cfg1), - Clone::clone(&cfg2), - Clone::clone(&cfg3), - )); - (cfg1, cfg2, cfg3) - } } /// `RouteHandler` wrapper. This struct is required because it needs to be diff --git a/src/with.rs b/src/with.rs index f7d75e5d7..c32f0a3bc 100644 --- a/src/with.rs +++ b/src/with.rs @@ -361,453 +361,3 @@ where self.poll() } } - -pub struct With2 -where - F: Fn(T1, T2) -> R, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - S: 'static, -{ - hnd: Rc>, - cfg1: ExtractorConfig, - cfg2: ExtractorConfig, - _s: PhantomData, -} - -impl With2 -where - F: Fn(T1, T2) -> R, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - S: 'static, -{ - pub fn new( - f: F, cfg1: ExtractorConfig, cfg2: ExtractorConfig, - ) -> Self { - With2 { - hnd: Rc::new(UnsafeCell::new(f)), - cfg1, - cfg2, - _s: PhantomData, - } - } -} - -impl Handler for With2 -where - F: Fn(T1, T2) -> R + 'static, - R: Responder + 'static, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - S: 'static, -{ - type Result = AsyncResult; - - fn handle(&mut self, req: HttpRequest) -> Self::Result { - let mut fut = WithHandlerFut2 { - req, - started: false, - hnd: Rc::clone(&self.hnd), - cfg1: self.cfg1.clone(), - cfg2: self.cfg2.clone(), - item: None, - fut1: None, - fut2: None, - fut3: None, - }; - match fut.poll() { - Ok(Async::Ready(resp)) => AsyncResult::ok(resp), - Ok(Async::NotReady) => AsyncResult::async(Box::new(fut)), - Err(e) => AsyncResult::ok(e), - } - } -} - -struct WithHandlerFut2 -where - F: Fn(T1, T2) -> R + 'static, - R: Responder + 'static, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - S: 'static, -{ - started: bool, - hnd: Rc>, - cfg1: ExtractorConfig, - cfg2: ExtractorConfig, - req: HttpRequest, - item: Option, - fut1: Option>>, - fut2: Option>>, - fut3: Option>>, -} - -impl Future for WithHandlerFut2 -where - F: Fn(T1, T2) -> R + 'static, - R: Responder + 'static, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - S: 'static, -{ - type Item = HttpResponse; - type Error = Error; - - fn poll(&mut self) -> Poll { - if let Some(ref mut fut) = self.fut3 { - return fut.poll(); - } - - if !self.started { - self.started = true; - let reply = T1::from_request(&self.req, self.cfg1.as_ref()).into(); - let item1 = match reply.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(msg) => msg, - AsyncResultItem::Future(fut) => { - self.fut1 = Some(fut); - return self.poll(); - } - }; - - let reply = T2::from_request(&self.req, self.cfg2.as_ref()).into(); - let item2 = match reply.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(msg) => msg, - AsyncResultItem::Future(fut) => { - self.item = Some(item1); - self.fut2 = Some(fut); - return self.poll(); - } - }; - - let hnd: &mut F = unsafe { &mut *self.hnd.get() }; - match (*hnd)(item1, item2).respond_to(&self.req) { - Ok(item) => match item.into().into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(resp) => return Ok(Async::Ready(resp)), - AsyncResultItem::Future(fut) => { - self.fut3 = Some(fut); - return self.poll(); - } - }, - Err(e) => return Err(e.into()), - } - } - - if self.fut1.is_some() { - match self.fut1.as_mut().unwrap().poll()? { - Async::Ready(item) => { - let reply = T2::from_request(&self.req, self.cfg2.as_ref()).into(); - let item2 = match reply.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(msg) => msg, - AsyncResultItem::Future(fut) => { - self.item = Some(item); - self.fut2 = Some(fut); - return self.poll(); - } - }; - - let hnd: &mut F = unsafe { &mut *self.hnd.get() }; - match (*hnd)(item, item2).respond_to(&self.req) { - Ok(item) => match item.into().into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(resp) => return Ok(Async::Ready(resp)), - AsyncResultItem::Future(fut) => { - self.fut3 = Some(fut); - return self.poll(); - } - }, - Err(e) => return Err(e.into()), - } - } - Async::NotReady => return Ok(Async::NotReady), - } - } - - let item = match self.fut2.as_mut().unwrap().poll()? { - Async::Ready(item) => item, - Async::NotReady => return Ok(Async::NotReady), - }; - - let hnd: &mut F = unsafe { &mut *self.hnd.get() }; - let item = match (*hnd)(self.item.take().unwrap(), item).respond_to(&self.req) { - Ok(item) => item.into(), - Err(err) => return Err(err.into()), - }; - - match item.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(resp) => return Ok(Async::Ready(resp)), - AsyncResultItem::Future(fut) => self.fut3 = Some(fut), - } - - self.poll() - } -} - -pub struct With3 -where - F: Fn(T1, T2, T3) -> R, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - T3: FromRequest + 'static, - S: 'static, -{ - hnd: Rc>, - cfg1: ExtractorConfig, - cfg2: ExtractorConfig, - cfg3: ExtractorConfig, - _s: PhantomData, -} - -impl With3 -where - F: Fn(T1, T2, T3) -> R, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - T3: FromRequest + 'static, - S: 'static, -{ - pub fn new( - f: F, cfg1: ExtractorConfig, cfg2: ExtractorConfig, - cfg3: ExtractorConfig, - ) -> Self { - With3 { - hnd: Rc::new(UnsafeCell::new(f)), - cfg1, - cfg2, - cfg3, - _s: PhantomData, - } - } -} - -impl Handler for With3 -where - F: Fn(T1, T2, T3) -> R + 'static, - R: Responder + 'static, - T1: FromRequest, - T2: FromRequest, - T3: FromRequest, - T1: 'static, - T2: 'static, - T3: 'static, - S: 'static, -{ - type Result = AsyncResult; - - fn handle(&mut self, req: HttpRequest) -> Self::Result { - let mut fut = WithHandlerFut3 { - req, - hnd: Rc::clone(&self.hnd), - cfg1: self.cfg1.clone(), - cfg2: self.cfg2.clone(), - cfg3: self.cfg3.clone(), - started: false, - item1: None, - item2: None, - fut1: None, - fut2: None, - fut3: None, - fut4: None, - }; - match fut.poll() { - Ok(Async::Ready(resp)) => AsyncResult::ok(resp), - Ok(Async::NotReady) => AsyncResult::async(Box::new(fut)), - Err(e) => AsyncResult::err(e), - } - } -} - -struct WithHandlerFut3 -where - F: Fn(T1, T2, T3) -> R + 'static, - R: Responder + 'static, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - T3: FromRequest + 'static, - S: 'static, -{ - hnd: Rc>, - req: HttpRequest, - cfg1: ExtractorConfig, - cfg2: ExtractorConfig, - cfg3: ExtractorConfig, - started: bool, - item1: Option, - item2: Option, - fut1: Option>>, - fut2: Option>>, - fut3: Option>>, - fut4: Option>>, -} - -impl Future for WithHandlerFut3 -where - F: Fn(T1, T2, T3) -> R + 'static, - R: Responder + 'static, - T1: FromRequest + 'static, - T2: FromRequest + 'static, - T3: FromRequest + 'static, - S: 'static, -{ - type Item = HttpResponse; - type Error = Error; - - fn poll(&mut self) -> Poll { - if let Some(ref mut fut) = self.fut4 { - return fut.poll(); - } - - if !self.started { - self.started = true; - let reply = T1::from_request(&self.req, self.cfg1.as_ref()).into(); - let item1 = match reply.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(msg) => msg, - AsyncResultItem::Future(fut) => { - self.fut1 = Some(fut); - return self.poll(); - } - }; - - let reply = T2::from_request(&self.req, self.cfg2.as_ref()).into(); - let item2 = match reply.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(msg) => msg, - AsyncResultItem::Future(fut) => { - self.item1 = Some(item1); - self.fut2 = Some(fut); - return self.poll(); - } - }; - - let reply = T3::from_request(&self.req, self.cfg3.as_ref()).into(); - let item3 = match reply.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(msg) => msg, - AsyncResultItem::Future(fut) => { - self.item1 = Some(item1); - self.item2 = Some(item2); - self.fut3 = Some(fut); - return self.poll(); - } - }; - - let hnd: &mut F = unsafe { &mut *self.hnd.get() }; - match (*hnd)(item1, item2, item3).respond_to(&self.req) { - Ok(item) => match item.into().into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(resp) => return Ok(Async::Ready(resp)), - AsyncResultItem::Future(fut) => { - self.fut4 = Some(fut); - return self.poll(); - } - }, - Err(e) => return Err(e.into()), - } - } - - if self.fut1.is_some() { - match self.fut1.as_mut().unwrap().poll()? { - Async::Ready(item) => { - self.item1 = Some(item); - self.fut1.take(); - let reply = T2::from_request(&self.req, self.cfg2.as_ref()).into(); - let item2 = match reply.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(msg) => msg, - AsyncResultItem::Future(fut) => { - self.fut2 = Some(fut); - return self.poll(); - } - }; - - let reply = T3::from_request(&self.req, self.cfg3.as_ref()).into(); - let item3 = match reply.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(msg) => msg, - AsyncResultItem::Future(fut) => { - self.item2 = Some(item2); - self.fut3 = Some(fut); - return self.poll(); - } - }; - let hnd: &mut F = unsafe { &mut *self.hnd.get() }; - match (*hnd)(self.item1.take().unwrap(), item2, item3) - .respond_to(&self.req) - { - Ok(item) => match item.into().into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(resp) => return Ok(Async::Ready(resp)), - AsyncResultItem::Future(fut) => { - self.fut4 = Some(fut); - return self.poll(); - } - }, - Err(e) => return Err(e.into()), - } - } - Async::NotReady => return Ok(Async::NotReady), - } - } - - if self.fut2.is_some() { - match self.fut2.as_mut().unwrap().poll()? { - Async::Ready(item) => { - self.fut2.take(); - let reply = T3::from_request(&self.req, self.cfg3.as_ref()).into(); - let item3 = match reply.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(msg) => msg, - AsyncResultItem::Future(fut) => { - self.item2 = Some(item); - self.fut3 = Some(fut); - return self.poll(); - } - }; - let hnd: &mut F = unsafe { &mut *self.hnd.get() }; - match (*hnd)(self.item1.take().unwrap(), item, item3) - .respond_to(&self.req) - { - Ok(item) => match item.into().into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(resp) => return Ok(Async::Ready(resp)), - AsyncResultItem::Future(fut) => { - self.fut4 = Some(fut); - return self.poll(); - } - }, - Err(e) => return Err(e.into()), - } - } - Async::NotReady => return Ok(Async::NotReady), - } - } - - let item = match self.fut3.as_mut().unwrap().poll()? { - Async::Ready(item) => item, - Async::NotReady => return Ok(Async::NotReady), - }; - - let hnd: &mut F = unsafe { &mut *self.hnd.get() }; - let item = - match (*hnd)(self.item1.take().unwrap(), self.item2.take().unwrap(), item) - .respond_to(&self.req) - { - Ok(item) => item.into(), - Err(err) => return Err(err.into()), - }; - - match item.into() { - AsyncResultItem::Err(err) => return Err(err), - AsyncResultItem::Ok(resp) => return Ok(Async::Ready(resp)), - AsyncResultItem::Future(fut) => self.fut4 = Some(fut), - } - - self.poll() - } -} diff --git a/tests/test_handlers.rs b/tests/test_handlers.rs index 8544b9bf2..5ece53eed 100644 --- a/tests/test_handlers.rs +++ b/tests/test_handlers.rs @@ -100,7 +100,7 @@ fn test_async_extractor_async() { fn test_path_and_query_extractor() { let mut srv = test::TestServer::new(|app| { app.resource("/{username}/index.html", |r| { - r.route().with2(|p: Path, q: Query| { + r.route().with(|(p, q): (Path, Query)| { format!("Welcome {} - {}!", p.username, q.username) }) }); @@ -134,7 +134,7 @@ fn test_path_and_query_extractor2() { let mut srv = test::TestServer::new(|app| { app.resource("/{username}/index.html", |r| { r.route() - .with3(|_: HttpRequest, p: Path, q: Query| { + .with(|(_r, p, q): (HttpRequest, Path, Query)| { format!("Welcome {} - {}!", p.username, q.username) }) }); @@ -167,14 +167,15 @@ fn test_path_and_query_extractor2() { fn test_path_and_query_extractor2_async() { let mut srv = test::TestServer::new(|app| { app.resource("/{username}/index.html", |r| { - r.route() - .with3(|p: Path, _: Query, data: Json| { + r.route().with( + |(p, _q, data): (Path, Query, Json)| { Delay::new(Instant::now() + Duration::from_millis(10)) .and_then(move |_| { Ok(format!("Welcome {} - {}!", p.username, data.0)) }) .responder() - }) + }, + ) }); }); @@ -197,7 +198,7 @@ fn test_path_and_query_extractor2_async() { fn test_path_and_query_extractor3_async() { let mut srv = test::TestServer::new(|app| { app.resource("/{username}/index.html", |r| { - r.route().with2(|p: Path, data: Json| { + r.route().with(|(p, data): (Path, Json)| { Delay::new(Instant::now() + Duration::from_millis(10)) .and_then(move |_| { Ok(format!("Welcome {} - {}!", p.username, data.0)) @@ -222,7 +223,7 @@ fn test_path_and_query_extractor3_async() { fn test_path_and_query_extractor4_async() { let mut srv = test::TestServer::new(|app| { app.resource("/{username}/index.html", |r| { - r.route().with2(|data: Json, p: Path| { + r.route().with(|(data, p): (Json, Path)| { Delay::new(Instant::now() + Duration::from_millis(10)) .and_then(move |_| { Ok(format!("Welcome {} - {}!", p.username, data.0)) @@ -247,14 +248,15 @@ fn test_path_and_query_extractor4_async() { fn test_path_and_query_extractor2_async2() { let mut srv = test::TestServer::new(|app| { app.resource("/{username}/index.html", |r| { - r.route() - .with3(|p: Path, data: Json, _: Query| { + r.route().with( + |(p, data, _q): (Path, Json, Query)| { Delay::new(Instant::now() + Duration::from_millis(10)) .and_then(move |_| { Ok(format!("Welcome {} - {}!", p.username, data.0)) }) .responder() - }) + }, + ) }); }); @@ -286,14 +288,15 @@ fn test_path_and_query_extractor2_async2() { fn test_path_and_query_extractor2_async3() { let mut srv = test::TestServer::new(|app| { app.resource("/{username}/index.html", |r| { - r.route() - .with3(|data: Json, p: Path, _: Query| { + r.route().with( + |(data, p, _q): (Json, Path, Query)| { Delay::new(Instant::now() + Duration::from_millis(10)) .and_then(move |_| { Ok(format!("Welcome {} - {}!", p.username, data.0)) }) .responder() - }) + }, + ) }); });