fix(client): remove idle connections when read eof is found
This commit is contained in:
@@ -874,13 +874,6 @@ mod tests {
|
|||||||
let mut conn = Conn::<_, proto::Chunk, ClientTransaction>::new(io, Default::default());
|
let mut conn = Conn::<_, proto::Chunk, ClientTransaction>::new(io, Default::default());
|
||||||
conn.state.busy();
|
conn.state.busy();
|
||||||
|
|
||||||
match conn.poll() {
|
|
||||||
Ok(Async::NotReady) => {},
|
|
||||||
other => panic!("unexpected frame: {:?}", other)
|
|
||||||
}
|
|
||||||
|
|
||||||
// once mid-request, returns the error
|
|
||||||
conn.state.writing = super::Writing::KeepAlive;
|
|
||||||
match conn.poll() {
|
match conn.poll() {
|
||||||
Err(ref err) if err.kind() == ::std::io::ErrorKind::UnexpectedEof => {},
|
Err(ref err) if err.kind() == ::std::io::ErrorKind::UnexpectedEof => {},
|
||||||
other => panic!("unexpected frame: {:?}", other)
|
other => panic!("unexpected frame: {:?}", other)
|
||||||
|
|||||||
@@ -184,11 +184,23 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn is_done(&self) -> bool {
|
fn is_done(&self) -> bool {
|
||||||
|
trace!(
|
||||||
|
"is_done; read={}, write={}, should_poll={}, body={}",
|
||||||
|
self.conn.is_read_closed(),
|
||||||
|
self.conn.is_write_closed(),
|
||||||
|
self.dispatch.should_poll(),
|
||||||
|
self.body_rx.is_some(),
|
||||||
|
);
|
||||||
let read_done = self.conn.is_read_closed();
|
let read_done = self.conn.is_read_closed();
|
||||||
let write_done = self.conn.is_write_closed() ||
|
|
||||||
(!self.dispatch.should_poll() && self.body_rx.is_none());
|
|
||||||
|
|
||||||
read_done && write_done
|
if !T::should_read_first() && read_done {
|
||||||
|
// a client that cannot read may was well be done.
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
let write_done = self.conn.is_write_closed() ||
|
||||||
|
(!self.dispatch.should_poll() && self.body_rx.is_none());
|
||||||
|
read_done && write_done
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user