li_async_h1/
body_encoder.rs

1use std::io;
2use std::pin::Pin;
3use std::task::{Context, Poll};
4
5use async_std::io::Read;
6use li_http_types::Body;
7use pin_project::pin_project;
8
9use crate::chunked::ChunkedEncoder;
10
11#[pin_project(project=BodyEncoderProjection)]
12#[derive(Debug)]
13pub(crate) enum BodyEncoder {
14    Chunked(#[pin] ChunkedEncoder<Body>),
15    Fixed(#[pin] Body),
16}
17
18impl BodyEncoder {
19    pub(crate) fn new(body: Body) -> Self {
20        match body.len() {
21            Some(_) => Self::Fixed(body),
22            None => Self::Chunked(ChunkedEncoder::new(body)),
23        }
24    }
25}
26
27impl Read for BodyEncoder {
28    fn poll_read(
29        self: Pin<&mut Self>,
30        cx: &mut Context<'_>,
31        buf: &mut [u8],
32    ) -> Poll<io::Result<usize>> {
33        match self.project() {
34            BodyEncoderProjection::Chunked(encoder) => encoder.poll_read(cx, buf),
35            BodyEncoderProjection::Fixed(body) => body.poll_read(cx, buf),
36        }
37    }
38}