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;

/// Copy data from reader to writer.
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)
}

/// Copy data from reader to writer.
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)
}