From fa72d82cc6cbd63e56368668afa3f6c9bb063c52 Mon Sep 17 00:00:00 2001 From: Thomas Tanon Date: Tue, 21 Jul 2026 21:46:49 +0200 Subject: [PATCH] Makes some copy operation faster --- src/io/encoder.rs | 8 +++++--- src/model/body.rs | 2 +- src/server.rs | 10 +++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/io/encoder.rs b/src/io/encoder.rs index 33e6100..6529d08 100644 --- a/src/io/encoder.rs +++ b/src/io/encoder.rs @@ -81,16 +81,18 @@ fn encode_body(body: &mut Body, writer: &mut impl Write, must_include_body: bool if let Some(length) = body.len() { if must_include_body || length > 0 { write!(writer, "content-length: {length}\r\n\r\n")?; - copy(body, writer)?; + if length > 0 { + copy(body, writer)?; + } } else { write!(writer, "\r\n")?; } } else { write!(writer, "transfer-encoding: chunked\r\n\r\n")?; - let mut buffer = vec![b'\0'; 4096]; + let mut buffer = [0; 4096]; loop { let mut read = 0; - while read < 1024 { + while read < buffer.len() { // We try to avoid too small chunks let new_read = body.read(&mut buffer[read..])?; if new_read == 0 { diff --git a/src/model/body.rs b/src/model/body.rs index 0d1f789..736886d 100644 --- a/src/model/body.rs +++ b/src/model/body.rs @@ -39,7 +39,7 @@ impl Body { Self(BodyAlt::Sized { total_len: len, consumed_len: 0, - content: Box::new(read.take(len)), + content: Box::new(read), }) } diff --git a/src/server.rs b/src/server.rs index 9643df2..0f35edf 100644 --- a/src/server.rs +++ b/src/server.rs @@ -261,7 +261,7 @@ fn read_body_and_build_response( Ok(mut request) => { let response = on_request(&mut request); // We make sure to finish reading the body - if let Err(error) = copy(request.body_mut(), &mut sink()) { + if let Err(error) = drain_body(request.body_mut()) { (build_error(error), ConnectionState::Close) // TODO: ignore? } else { let connection_state = request @@ -305,6 +305,14 @@ fn build_text_response(status: StatusCode, text: String) -> Response { .unwrap() } +fn drain_body(body: &mut Body) -> Result<()> { + if body.len() == Some(0) { + return Ok(()); // Nothing to drain + } + copy(body, &mut sink())?; + Ok(()) +} + /// Dumb semaphore allowing to overflow capacity #[derive(Clone)] struct Semaphore {