From cf2d51b7039437558ab6def01526462c3fa766fb Mon Sep 17 00:00:00 2001 From: Oliver Stenbom Date: Fri, 27 Mar 2026 08:51:44 +0100 Subject: [PATCH] Use a body stream for worker requests --- worker/src/lib.rs | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/worker/src/lib.rs b/worker/src/lib.rs index 8d12e55..16b54b1 100644 --- a/worker/src/lib.rs +++ b/worker/src/lib.rs @@ -1,5 +1,5 @@ use axum::{ - body::to_bytes, + body::HttpBody, extract::{Json, Query, Request, State}, http::StatusCode, middleware::{from_fn_with_state, Next}, @@ -403,18 +403,8 @@ async fn linkup_request_handler( async fn convert_request( req: http::Request, ) -> Result { - const MAX_BODY_SIZE: usize = 100 * 1024 * 1024; // 100MB, same as local-server limit - let (parts, body) = req.into_parts(); - let body_bytes = match to_bytes(body, MAX_BODY_SIZE).await { - Ok(bytes) => bytes, - Err(e) => { - return Err(HttpError::new( - format!("Failed to extract request body: {}", e), - StatusCode::BAD_REQUEST, - )); - } - }; + let has_body = !body.is_end_stream(); let target_url = parts.uri.to_string(); @@ -431,10 +421,17 @@ async fn convert_request( .with_headers(headers) .with_redirect(RequestRedirect::Manual); - if !body_bytes.is_empty() { - request_init.with_body(Some(wasm_bindgen::JsValue::from_str( - &String::from_utf8_lossy(&body_bytes), - ))); + if has_body { + let body_stream = worker::Body::from_stream(body.into_data_stream()).map_err(|e| { + HttpError::new( + format!("Failed to stream request body: {}", e), + StatusCode::BAD_GATEWAY, + ) + })?; + + if let Some(body_stream) = body_stream.into_inner() { + request_init.with_body(Some(wasm_bindgen::JsValue::from(body_stream))); + } } let worker_request: worker::Request =