1
0
mirror of https://github.com/actix/actix-extras.git synced 2024-11-30 18:34:36 +01:00

Fix client request timeout handling

This commit is contained in:
Nikolay Kim 2018-05-10 09:37:38 -07:00
parent c172deb0f3
commit 92f993e054
3 changed files with 9 additions and 6 deletions

View File

@ -6,6 +6,8 @@
* Added error response functions for 501,502,503,504 * Added error response functions for 501,502,503,504
* Fix client request timeout handling
## 0.6.2 (2018-05-09) ## 0.6.2 (2018-05-09)

View File

@ -49,6 +49,7 @@ use httpresponse::HttpResponse;
impl ResponseError for SendRequestError { impl ResponseError for SendRequestError {
fn error_response(&self) -> HttpResponse { fn error_response(&self) -> HttpResponse {
match *self { match *self {
SendRequestError::Timeout => HttpResponse::GatewayTimeout(),
SendRequestError::Connector(_) => HttpResponse::BadGateway(), SendRequestError::Connector(_) => HttpResponse::BadGateway(),
_ => HttpResponse::InternalServerError(), _ => HttpResponse::InternalServerError(),
}.into() }.into()

View File

@ -194,6 +194,7 @@ impl Future for SendRequest {
self.state = State::Send(pl); self.state = State::Send(pl);
} }
State::Send(mut pl) => { State::Send(mut pl) => {
pl.poll_timeout()?;
pl.poll_write().map_err(|e| { pl.poll_write().map_err(|e| {
io::Error::new(io::ErrorKind::Other, format!("{}", e).as_str()) io::Error::new(io::ErrorKind::Other, format!("{}", e).as_str())
})?; })?;
@ -315,7 +316,7 @@ impl Pipeline {
{ {
Async::NotReady => need_run = true, Async::NotReady => need_run = true,
Async::Ready(_) => { Async::Ready(_) => {
let _ = self.poll_timeout().map_err(|e| { self.poll_timeout().map_err(|e| {
io::Error::new(io::ErrorKind::Other, format!("{}", e)) io::Error::new(io::ErrorKind::Other, format!("{}", e))
})?; })?;
} }
@ -371,16 +372,15 @@ impl Pipeline {
} }
} }
fn poll_timeout(&mut self) -> Poll<(), SendRequestError> { fn poll_timeout(&mut self) -> Result<(), SendRequestError> {
if self.timeout.is_some() { if self.timeout.is_some() {
match self.timeout.as_mut().unwrap().poll() { match self.timeout.as_mut().unwrap().poll() {
Ok(Async::Ready(())) => Err(SendRequestError::Timeout), Ok(Async::Ready(())) => return Err(SendRequestError::Timeout),
Ok(Async::NotReady) => Ok(Async::NotReady), Ok(Async::NotReady) => (),
Err(_) => unreachable!(), Err(_) => unreachable!(),
} }
} else {
Ok(Async::NotReady)
} }
Ok(())
} }
#[inline] #[inline]