1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use futures::{AsyncReadExt, AsyncWriteExt};
use std::io::Result;
use std::marker::Unpin;
pub async fn copy_buffer<R, W>(reader: &mut R, writer: &mut W, buffer: &mut [u8]) -> Result<usize>
where
R: AsyncReadExt + Unpin,
W: AsyncWriteExt + Unpin,
{
let mut n = 0;
loop {
let nn = reader.read(&mut buffer[..]).await?;
if nn == 0 {
break;
}
n += nn;
writer.write_all(&buffer[..nn]).await?;
}
Ok(n)
}
pub async fn copy<R, W>(reader: &mut R, writer: &mut W) -> Result<usize>
where
R: AsyncReadExt + Unpin,
W: AsyncWriteExt + Unpin,
{
const BUF_SIZE: usize = 32 * 1024;
let mut buffer = [0u8; BUF_SIZE];
let n = copy_buffer(reader, writer, &mut buffer).await?;
Ok(n)
}