mirror of
https://github.com/actix/actix-extras.git
synced 2024-11-24 16:02:59 +01:00
start client timeout for response only
This commit is contained in:
parent
c1af59c618
commit
eeae0ddab4
@ -115,19 +115,6 @@ impl SendRequest {
|
|||||||
self.conn_timeout = timeout;
|
self.conn_timeout = timeout;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
fn poll_timeout(&mut self) -> Poll<(), SendRequestError> {
|
|
||||||
if self.timeout.is_none() {
|
|
||||||
self.timeout = Some(Timeout::new(
|
|
||||||
Duration::from_secs(5), Arbiter::handle()).unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
match self.timeout.as_mut().unwrap().poll() {
|
|
||||||
Ok(Async::Ready(())) => Err(SendRequestError::Timeout),
|
|
||||||
Ok(Async::NotReady) => Ok(Async::NotReady),
|
|
||||||
Err(_) => unreachable!()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Future for SendRequest {
|
impl Future for SendRequest {
|
||||||
@ -135,8 +122,6 @@ impl Future for SendRequest {
|
|||||||
type Error = SendRequestError;
|
type Error = SendRequestError;
|
||||||
|
|
||||||
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
|
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
|
||||||
self.poll_timeout()?;
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let state = mem::replace(&mut self.state, State::None);
|
let state = mem::replace(&mut self.state, State::None);
|
||||||
|
|
||||||
@ -170,6 +155,10 @@ impl Future for SendRequest {
|
|||||||
_ => IoBody::Done,
|
_ => IoBody::Done,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let timeout = self.timeout.take().unwrap_or_else(||
|
||||||
|
Timeout::new(
|
||||||
|
Duration::from_secs(5), Arbiter::handle()).unwrap());
|
||||||
|
|
||||||
let pl = Box::new(Pipeline {
|
let pl = Box::new(Pipeline {
|
||||||
body, writer,
|
body, writer,
|
||||||
conn: Some(conn),
|
conn: Some(conn),
|
||||||
@ -180,6 +169,7 @@ impl Future for SendRequest {
|
|||||||
decompress: None,
|
decompress: None,
|
||||||
should_decompress: self.req.response_decompress(),
|
should_decompress: self.req.response_decompress(),
|
||||||
write_state: RunningState::Running,
|
write_state: RunningState::Running,
|
||||||
|
timeout: Some(timeout),
|
||||||
});
|
});
|
||||||
self.state = State::Send(pl);
|
self.state = State::Send(pl);
|
||||||
},
|
},
|
||||||
@ -218,6 +208,7 @@ pub(crate) struct Pipeline {
|
|||||||
decompress: Option<PayloadStream>,
|
decompress: Option<PayloadStream>,
|
||||||
should_decompress: bool,
|
should_decompress: bool,
|
||||||
write_state: RunningState,
|
write_state: RunningState,
|
||||||
|
timeout: Option<Timeout>,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum IoBody {
|
enum IoBody {
|
||||||
@ -292,10 +283,14 @@ impl Pipeline {
|
|||||||
let mut need_run = false;
|
let mut need_run = false;
|
||||||
|
|
||||||
// need write?
|
// need write?
|
||||||
if let Async::NotReady = self.poll_write()
|
match self.poll_write()
|
||||||
.map_err(|e| io::Error::new(io::ErrorKind::Other, format!("{}", e)))?
|
.map_err(|e| io::Error::new(io::ErrorKind::Other, format!("{}", e)))?
|
||||||
{
|
{
|
||||||
need_run = true;
|
Async::NotReady => need_run = true,
|
||||||
|
Async::Ready(_) => {
|
||||||
|
let _ = self.poll_timeout()
|
||||||
|
.map_err(|e| io::Error::new(io::ErrorKind::Other, format!("{}", e)))?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// need read?
|
// need read?
|
||||||
@ -343,6 +338,18 @@ impl Pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn poll_timeout(&mut self) -> Poll<(), SendRequestError> {
|
||||||
|
if self.timeout.is_some() {
|
||||||
|
match self.timeout.as_mut().unwrap().poll() {
|
||||||
|
Ok(Async::Ready(())) => Err(SendRequestError::Timeout),
|
||||||
|
Ok(Async::NotReady) => Ok(Async::NotReady),
|
||||||
|
Err(_) => unreachable!()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Ok(Async::NotReady)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn poll_write(&mut self) -> Poll<(), Error> {
|
fn poll_write(&mut self) -> Poll<(), Error> {
|
||||||
if self.write_state == RunningState::Done || self.conn.is_none() {
|
if self.write_state == RunningState::Done || self.conn.is_none() {
|
||||||
@ -350,7 +357,6 @@ impl Pipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mut done = false;
|
let mut done = false;
|
||||||
|
|
||||||
if self.drain.is_none() && self.write_state != RunningState::Paused {
|
if self.drain.is_none() && self.write_state != RunningState::Paused {
|
||||||
'outter: loop {
|
'outter: loop {
|
||||||
let result = match mem::replace(&mut self.body, IoBody::Done) {
|
let result = match mem::replace(&mut self.body, IoBody::Done) {
|
||||||
|
@ -69,7 +69,7 @@ impl<T, H> Future for HttpChannel<T, H> where T: IoStream, H: HttpHandler + 'sta
|
|||||||
type Error = ();
|
type Error = ();
|
||||||
|
|
||||||
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
|
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
|
||||||
if !self.node.is_none() {
|
if self.node.is_some() {
|
||||||
let el = self as *mut _;
|
let el = self as *mut _;
|
||||||
self.node = Some(Node::new(el));
|
self.node = Some(Node::new(el));
|
||||||
let _ = match self.proto {
|
let _ = match self.proto {
|
||||||
|
Loading…
Reference in New Issue
Block a user