nuclear 0.0.10

[WIP] a web framework for humans
Documentation
use crate::body::BodyError;
use crate::internal_prelude::*;

use std::ops;

use bytes::{BufMut, Bytes, BytesMut};
use futures::stream::StreamExt;

#[derive(Debug)]
pub struct Request {
    inner: Box<HyperRequest>,
}

impl Request {
    pub(super) fn from_hyper(req: HyperRequest) -> Self {
        Self {
            inner: Box::new(req),
        }
    }

    pub async fn body_bytes(&mut self, length_limit: usize) -> Result<Bytes> {
        let body = self.body_mut();

        let mut bufs: Vec<Bytes> = Vec::new();
        let mut total: usize = 0;

        while let Some(bytes) = body.next().await.transpose()? {
            total = match total.checked_add(bytes.len()) {
                Some(t) if t <= length_limit => t,
                _ => return Err(BodyError::LengthLimitExceeded.into()),
            };

            bufs.push(bytes);
        }

        let mut buf: BytesMut = BytesMut::with_capacity(total);
        for bytes in bufs {
            buf.put(bytes);
        }

        Ok(buf.freeze())
    }
}

impl ops::Deref for Request {
    type Target = HyperRequest;

    fn deref(&self) -> &Self::Target {
        self.inner.as_ref()
    }
}

impl ops::DerefMut for Request {
    fn deref_mut(&mut self) -> &mut Self::Target {
        self.inner.as_mut()
    }
}