uhttp 0.22.0

Simple http server for humans
Documentation
use std::borrow::Cow;
use std::convert::Infallible;

use futures::TryStreamExt;
use tokio::io::DuplexStream;

pub enum ResponseBody {
  Bytes(Vec<u8>),
  BoxedBody(super::types::HyperBytesResponse),
}

impl From<Vec<u8>> for ResponseBody {
  fn from(value: Vec<u8>) -> Self {
    Self::Bytes(value)
  }
}

impl From<&[u8]> for ResponseBody {
  fn from(value: &[u8]) -> Self {
    Self::Bytes(value.to_vec())
  }
}

impl<const N: usize> From<&[u8; N]> for ResponseBody {
  fn from(value: &[u8; N]) -> Self {
    Self::Bytes(value.to_vec())
  }
}

impl<'a> From<Cow<'a, [u8]>> for ResponseBody {
  fn from(value: Cow<'a, [u8]>) -> Self {
    Self::Bytes(value.to_vec())
  }
}

impl From<&str> for ResponseBody {
  fn from(value: &str) -> Self {
    Self::Bytes(value.as_bytes().to_vec())
  }
}

impl From<String> for ResponseBody {
  fn from(value: String) -> Self {
    Self::Bytes(value.as_bytes().to_vec())
  }
}

impl From<super::types::HyperBytesResponse> for ResponseBody {
  fn from(value: super::types::HyperBytesResponse) -> Self {
    Self::BoxedBody(value)
  }
}

impl ResponseBody {
  pub fn chunked(max_buffer_size: usize) -> (Self, DuplexStream) {
    let (writer, reader) = tokio::io::duplex(max_buffer_size);

    let reader_stream = tokio_util::io::ReaderStream::new(reader)
      .map_ok(hyper::body::Frame::data)
      .map_err(|_item| panic!());

    let stream_body = http_body_util::StreamBody::new(reader_stream);
    let boxed_body =
      super::types::HttpBoxBody::<super::types::HyperBytes, Infallible>::new(stream_body);

    (Self::BoxedBody(boxed_body), writer)
  }
}