From af46cbbe1b02bfce89bc167ca01bc7df25e415f5 Mon Sep 17 00:00:00 2001 From: Filip Tibell Date: Sun, 27 Apr 2025 13:05:00 +0200 Subject: [PATCH] Share incoming body implementation between both client and server --- crates/lune-std-net/src/shared/incoming.rs | 31 ++++++++++++++++++++++ crates/lune-std-net/src/shared/mod.rs | 1 + crates/lune-std-net/src/shared/request.rs | 26 ++++++------------ crates/lune-std-net/src/shared/response.rs | 28 +++++++------------ 4 files changed, 49 insertions(+), 37 deletions(-) create mode 100644 crates/lune-std-net/src/shared/incoming.rs diff --git a/crates/lune-std-net/src/shared/incoming.rs b/crates/lune-std-net/src/shared/incoming.rs new file mode 100644 index 0000000..3743710 --- /dev/null +++ b/crates/lune-std-net/src/shared/incoming.rs @@ -0,0 +1,31 @@ +use futures_lite::prelude::*; +use http_body_util::BodyStream; +use hyper::{ + body::{Body as _, Bytes, Incoming}, + HeaderMap, +}; + +use mlua::prelude::*; + +pub async fn handle_incoming_body( + _headers: &HeaderMap, + body: Incoming, + _decompress: bool, +) -> LuaResult<(Bytes, bool)> { + let size = body.size_hint().lower() as usize; + let buffer = Vec::::with_capacity(size); + + let body = BodyStream::new(body) + .try_fold(buffer, |mut body, chunk| { + if let Some(chunk) = chunk.data_ref() { + body.extend_from_slice(chunk); + } + Ok(body) + }) + .await + .into_lua_err()?; + + // TODO: Decompress the body if necessary + + Ok((Bytes::from(body), false)) +} diff --git a/crates/lune-std-net/src/shared/mod.rs b/crates/lune-std-net/src/shared/mod.rs index 5f8736e..21a2272 100644 --- a/crates/lune-std-net/src/shared/mod.rs +++ b/crates/lune-std-net/src/shared/mod.rs @@ -1,4 +1,5 @@ pub mod headers; pub mod hyper; +pub mod incoming; pub mod request; pub mod response; diff --git a/crates/lune-std-net/src/shared/request.rs b/crates/lune-std-net/src/shared/request.rs index cc09556..1a7d5a4 100644 --- a/crates/lune-std-net/src/shared/request.rs +++ b/crates/lune-std-net/src/shared/request.rs @@ -1,11 +1,10 @@ use std::collections::HashMap; -use futures_lite::prelude::*; -use http_body_util::{BodyStream, Full}; +use http_body_util::Full; use url::Url; use hyper::{ - body::{Body as _, Bytes, Incoming}, + body::{Bytes, Incoming}, header::{HeaderName, HeaderValue}, HeaderMap, Method, Request as HyperRequest, }; @@ -14,7 +13,10 @@ use mlua::prelude::*; use crate::{ client::config::RequestConfig, - shared::headers::{hash_map_to_table, header_map_to_table}, + shared::{ + headers::{hash_map_to_table, header_map_to_table}, + incoming::handle_incoming_body, + }, }; #[derive(Debug, Clone)] @@ -36,22 +38,10 @@ impl Request { ) -> LuaResult { let (parts, body) = incoming.into_parts(); - let size = body.size_hint().lower() as usize; - let buffer = Vec::::with_capacity(size); - let body = BodyStream::new(body) - .try_fold(buffer, |mut body, chunk| { - if let Some(chunk) = chunk.data_ref() { - body.extend_from_slice(chunk); - } - Ok(body) - }) - .await - .into_lua_err()?; - - // TODO: Decompress body if decompress is true and headers are present + let (body, decompress) = handle_incoming_body(&parts.headers, body, decompress).await?; Ok(Self { - inner: HyperRequest::from_parts(parts, Bytes::from(body)), + inner: HyperRequest::from_parts(parts, body), redirects: 0, decompress, }) diff --git a/crates/lune-std-net/src/shared/response.rs b/crates/lune-std-net/src/shared/response.rs index d3311b2..9db245e 100644 --- a/crates/lune-std-net/src/shared/response.rs +++ b/crates/lune-std-net/src/shared/response.rs @@ -1,15 +1,17 @@ -use futures_lite::prelude::*; -use http_body_util::{BodyStream, Full}; +use http_body_util::Full; use hyper::{ - body::{Body, Bytes, Incoming}, + body::{Bytes, Incoming}, header::{HeaderName, HeaderValue}, HeaderMap, Response as HyperResponse, }; use mlua::prelude::*; -use crate::{server::config::ResponseConfig, shared::headers::header_map_to_table}; +use crate::{ + server::config::ResponseConfig, + shared::{headers::header_map_to_table, incoming::handle_incoming_body}, +}; #[derive(Debug, Clone)] pub struct Response { @@ -29,23 +31,11 @@ impl Response { ) -> LuaResult { let (parts, body) = incoming.into_parts(); - let size = body.size_hint().lower() as usize; - let buffer = Vec::::with_capacity(size); - let body = BodyStream::new(body) - .try_fold(buffer, |mut body, chunk| { - if let Some(chunk) = chunk.data_ref() { - body.extend_from_slice(chunk); - } - Ok(body) - }) - .await - .into_lua_err()?; - - // TODO: Decompress body if decompress is true and headers are present + let (body, decompressed) = handle_incoming_body(&parts.headers, body, decompress).await?; Ok(Self { - inner: HyperResponse::from_parts(parts, Bytes::from(body)), - decompressed: decompress, + inner: HyperResponse::from_parts(parts, body), + decompressed, }) }