From f907be585e0aaad21e1289bdb5c84c27b1a85550 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Wed, 18 Apr 2018 14:15:53 -0700 Subject: [PATCH] Middleware response() is not invoked if there was an error in async handler #187 --- CHANGES.md | 5 +++++ src/httprequest.rs | 2 ++ src/pipeline.rs | 2 +- src/route.rs | 2 +- tests/test_server.rs | 33 ++++++++++++++++++++++++++++++++- 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 7a8e3b44d..c2f73fe2a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,10 @@ # Changes +## 0.5.4 (2018-04-xx) + +* Middleware response() is not invoked if there was an error in async handler #187 + + ## 0.5.3 (2018-04-18) * Impossible to quote slashes in path parameters #182 diff --git a/src/httprequest.rs b/src/httprequest.rs index 62efa4834..08e8f2bc1 100644 --- a/src/httprequest.rs +++ b/src/httprequest.rs @@ -590,6 +590,8 @@ impl fmt::Debug for HttpRequest { #[cfg(test)] mod tests { + #![allow(deprecated)] + use super::*; use http::{HttpTryFrom, Uri}; use resource::ResourceHandler; diff --git a/src/pipeline.rs b/src/pipeline.rs index 1e5685ba4..3e90a6dc2 100644 --- a/src/pipeline.rs +++ b/src/pipeline.rs @@ -328,7 +328,7 @@ impl WaitingResponse { match self.fut.poll() { Ok(Async::NotReady) => None, Ok(Async::Ready(response)) => Some(RunMiddlewares::init(info, response)), - Err(err) => Some(ProcessResponse::init(err.into())), + Err(err) => Some(RunMiddlewares::init(info, err.into())), } } } diff --git a/src/route.rs b/src/route.rs index b7b84ad0c..526eb1377 100644 --- a/src/route.rs +++ b/src/route.rs @@ -420,7 +420,7 @@ impl WaitingResponse { match self.fut.poll() { Ok(Async::NotReady) => None, Ok(Async::Ready(response)) => Some(RunMiddlewares::init(info, response)), - Err(err) => Some(Response::init(err.into())), + Err(err) => Some(RunMiddlewares::init(info, err.into())), } } } diff --git a/tests/test_server.rs b/tests/test_server.rs index a2ff63cc9..162f193bf 100644 --- a/tests/test_server.rs +++ b/tests/test_server.rs @@ -18,7 +18,7 @@ use flate2::Compression; use flate2::read::GzDecoder; use flate2::write::{DeflateDecoder, DeflateEncoder, GzEncoder}; use futures::stream::once; -use futures::{Future, Stream}; +use futures::{future, Future, Stream}; use h2::client as h2client; use modhttp::Request; use rand::Rng; @@ -915,3 +915,34 @@ fn test_resource_middlewares() { assert_eq!(num2.load(Ordering::Relaxed), 1); // assert_eq!(num3.load(Ordering::Relaxed), 1); } + + +fn index_test_middleware_async_error(_: HttpRequest) -> FutureResponse { + future::result(Err(error::ErrorBadRequest("TEST"))).responder() +} + +#[test] +fn test_middleware_async_error() { + let req = Arc::new(AtomicUsize::new(0)); + let resp = Arc::new(AtomicUsize::new(0)); + let fin = Arc::new(AtomicUsize::new(0)); + + let act_req = Arc::clone(&req); + let act_resp = Arc::clone(&resp); + let act_fin = Arc::clone(&fin); + + let mut srv = test::TestServer::new(move |app| { + app.middleware(MiddlewareTest { + start: Arc::clone(&act_req), + response: Arc::clone(&act_resp), + finish: Arc::clone(&act_fin), + }).handler(index_test_middleware_async_error)}); + + let request = srv.get().finish().unwrap(); + let response = srv.execute(request.send()).unwrap(); + assert_eq!(response.status(), http::StatusCode::BAD_REQUEST); + + assert_eq!(req.load(Ordering::Relaxed), 1); + assert_eq!(resp.load(Ordering::Relaxed), 1); + assert_eq!(fin.load(Ordering::Relaxed), 1); +}