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