pub fn read_chunk_data<'a, R: AsyncRead>(
reader: Pin<&'a mut R>,
chunk_size: ChunkSize,
message_length: u32,
) -> ChunkDataReader<'a, R>
Expand description
Reads a chunk data from streams.
If a chunk data exceeds specified chunk size, to insert continue headers between chunk data per chunk size is required. Note the message length doesn’t count their headers.
§Examples
use std::{
io::Result as IOResult,
pin::pin
};
use rand::{
Fill,
random,
thread_rng
};
use sheave_core::{
messages::{
ChunkSize,
headers::MessageFormat
},
readers::read_chunk_data
};
#[tokio::main]
async fn main() -> IOResult<()> {
let chunk_size = ChunkSize::default();
// When it's just one chunk.
let mut reader: [u8; 128] = [0; 128];
reader.try_fill(&mut thread_rng()).unwrap();
let result = read_chunk_data(pin!(reader.as_slice()), chunk_size, 128).await?;
assert_eq!(128, result.len());
// When it has the one byte header.
let mut reader: [u8; 257] = [0; 257];
let mut part: [u8; 128] = [0; 128];
part.try_fill(&mut thread_rng()).unwrap();
reader[..128].copy_from_slice(&part);
reader[128] = u8::from(MessageFormat::Continue) << 6 | 2;
reader[129..].copy_from_slice(&part);
let result = read_chunk_data(pin!(reader.as_slice()), chunk_size, 256).await?;
assert_eq!(256, result.len());
// When it has the two bytes header.
let mut reader: [u8; 258] = [0; 258];
let mut part: [u8; 128] = [0; 128];
part.try_fill(&mut thread_rng()).unwrap();
reader[..128].copy_from_slice(&part);
reader[128] = u8::from(MessageFormat::Continue) << 6;
reader[129] = 2;
reader[130..].copy_from_slice(&part);
let result = read_chunk_data(pin!(reader.as_slice()), chunk_size, 256).await?;
assert_eq!(256, result.len());
// When it has the three bytes header.
let mut reader: [u8; 259] = [0; 259];
let mut part: [u8; 128] = [0; 128];
part.try_fill(&mut thread_rng()).unwrap();
reader[..128].copy_from_slice(&part);
reader[128] = u8::from(MessageFormat::Continue) << 6 | 1;
reader[129..131].copy_from_slice(&2u16.to_le_bytes());
reader[131..].copy_from_slice(&part);
let result = read_chunk_data(pin!(reader.as_slice()), chunk_size, 256).await?;
assert_eq!(256, result.len());
Ok(())
}