diff --git a/src/bytes_reader.rs b/src/bytes_reader.rs index 51897b5..576ad6f 100644 --- a/src/bytes_reader.rs +++ b/src/bytes_reader.rs @@ -1,3 +1,5 @@ +use std::io::BufRead; + use actix_web::web::Bytes; pub(crate) struct BytesReader { @@ -83,27 +85,18 @@ impl std::io::Read for BytesReader { let mut written = 0; loop { - let mut position = self.position; - - for bytes in &self.buf { - if position < bytes.len() { - let copy_len = (bytes.len() - position).min(buf.len() - written); - - buf[written..written + copy_len] - .copy_from_slice(&bytes[position..position + copy_len]); - position = 0; - self.position += copy_len; + match self.fill_buf() { + Ok([]) => return Ok(written), + Ok(b) => { + let copy_len = buf[written..].len().min(b.len()); + buf[written..written + copy_len].copy_from_slice(&b[..copy_len]); + self.consume(copy_len); written += copy_len; - - if written == buf.len() { - return Ok(written); - } - } else { - position -= bytes.len(); } + Err(e) => return Err(e), } - if !self.blocking_recv()? { + if written == buf.len() { return Ok(written); } }