diff --git a/src/server/utils.rs b/src/server/utils.rs index b0470d76b..e0e7e7f62 100644 --- a/src/server/utils.rs +++ b/src/server/utils.rs @@ -1,5 +1,5 @@ use bytes::{BufMut, BytesMut}; -use futures::Poll; +use futures::{Async, Poll}; use std::io; use super::IoStream; @@ -10,8 +10,22 @@ const HW_BUFFER_SIZE: usize = 32_768; pub fn read_from_io( io: &mut T, buf: &mut BytesMut, ) -> Poll { - if buf.remaining_mut() < LW_BUFFER_SIZE { - buf.reserve(HW_BUFFER_SIZE); + unsafe { + if buf.remaining_mut() < LW_BUFFER_SIZE { + buf.reserve(HW_BUFFER_SIZE); + } + match io.read(buf.bytes_mut()) { + Ok(n) => { + buf.advance_mut(n); + Ok(Async::Ready(n)) + } + Err(e) => { + if e.kind() == io::ErrorKind::WouldBlock { + Ok(Async::NotReady) + } else { + Err(e) + } + } + } } - io.read_buf(buf) }