rw-stream-sink: Skip over empty stream items. (#677)

Otherwise it may report the reading of 0 bytes which is interpreted as
EOF by consumers of `std::io::Read::read`.
This commit is contained in:
Toralf Wittner 2018-11-23 13:54:17 +01:00 committed by GitHub
parent 1da97242da
commit aa86f6824d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -80,23 +80,33 @@ where
};
if need_new_item {
self.current_item = match self.inner.poll() {
Ok(Async::Ready(i)) => i.map(|b| b.into_buf()),
Ok(Async::NotReady) => {
if written == 0 {
return Err(IoError::new(IoErrorKind::WouldBlock, "stream not ready"));
} else {
return Ok(written);
loop {
self.current_item = match self.inner.poll() {
Ok(Async::Ready(None)) => None,
Ok(Async::Ready(Some(i))) => {
let b = i.into_buf();
if !b.has_remaining() {
continue // skip over empty items
}
Some(b)
}
}
Err(err) => {
if written == 0 {
return Err(err);
} else {
return Ok(written);
Ok(Async::NotReady) => {
if written == 0 {
return Err(IoError::new(IoErrorKind::WouldBlock, "stream not ready"));
} else {
return Ok(written);
}
}
}
};
Err(err) => {
if written == 0 {
return Err(err);
} else {
return Ok(written);
}
}
};
break
}
}
let current_item = match self.current_item {