li_async_h1/
body_encoder.rs1use 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}