From eae587f1b6d4a45e64851567eed232d4f5d1ef58 Mon Sep 17 00:00:00 2001 From: DioCrafts Date: Tue, 3 Mar 2026 19:46:38 +0100 Subject: [PATCH] perf(h1): eliminate ParserConfig clones in parse loop Change ParseContext.h1_parser_config from owned ParserConfig to &ParserConfig. This avoids cloning the parser config on every HTTP/1 parse iteration, reducing allocations in the hot path. - mod.rs: Change field type from ParserConfig to &'a ParserConfig - conn.rs: Pass reference instead of clone - io.rs: Remove .clone() call when building ParseContext - role.rs: Update 20 test sites to pass references --- src/proto/h1/conn.rs | 2 +- src/proto/h1/io.rs | 4 ++-- src/proto/h1/mod.rs | 2 +- src/proto/h1/role.rs | 40 ++++++++++++++++++++-------------------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/proto/h1/conn.rs b/src/proto/h1/conn.rs index 3d71ed5bc5..94b2844538 100644 --- a/src/proto/h1/conn.rs +++ b/src/proto/h1/conn.rs @@ -239,7 +239,7 @@ where ParseContext { cached_headers: &mut self.state.cached_headers, req_method: &mut self.state.method, - h1_parser_config: self.state.h1_parser_config.clone(), + h1_parser_config: &self.state.h1_parser_config, h1_max_headers: self.state.h1_max_headers, preserve_header_case: self.state.preserve_header_case, #[cfg(feature = "ffi")] diff --git a/src/proto/h1/io.rs b/src/proto/h1/io.rs index 6a30d73c84..6a952bcd37 100644 --- a/src/proto/h1/io.rs +++ b/src/proto/h1/io.rs @@ -182,7 +182,7 @@ where ParseContext { cached_headers: parse_ctx.cached_headers, req_method: parse_ctx.req_method, - h1_parser_config: parse_ctx.h1_parser_config.clone(), + h1_parser_config: parse_ctx.h1_parser_config, h1_max_headers: parse_ctx.h1_max_headers, preserve_header_case: parse_ctx.preserve_header_case, #[cfg(feature = "ffi")] @@ -704,7 +704,7 @@ mod tests { let parse_ctx = ParseContext { cached_headers: &mut None, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] diff --git a/src/proto/h1/mod.rs b/src/proto/h1/mod.rs index a8f36f5fd9..1fea370cc5 100644 --- a/src/proto/h1/mod.rs +++ b/src/proto/h1/mod.rs @@ -71,7 +71,7 @@ pub(crate) struct ParsedMessage { pub(crate) struct ParseContext<'a> { cached_headers: &'a mut Option, req_method: &'a mut Option, - h1_parser_config: ParserConfig, + h1_parser_config: &'a ParserConfig, h1_max_headers: Option, preserve_header_case: bool, #[cfg(feature = "ffi")] diff --git a/src/proto/h1/role.rs b/src/proto/h1/role.rs index f92092e5a9..92cbcccb88 100644 --- a/src/proto/h1/role.rs +++ b/src/proto/h1/role.rs @@ -1674,7 +1674,7 @@ mod tests { ParseContext { cached_headers: &mut None, req_method: &mut method, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1702,7 +1702,7 @@ mod tests { let ctx = ParseContext { cached_headers: &mut None, req_method: &mut Some(crate::Method::GET), - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1726,7 +1726,7 @@ mod tests { let ctx = ParseContext { cached_headers: &mut None, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1747,7 +1747,7 @@ mod tests { let ctx = ParseContext { cached_headers: &mut None, req_method: &mut Some(crate::Method::GET), - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1770,7 +1770,7 @@ mod tests { let ctx = ParseContext { cached_headers: &mut None, req_method: &mut Some(crate::Method::GET), - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1797,7 +1797,7 @@ mod tests { let ctx = ParseContext { cached_headers: &mut None, req_method: &mut Some(crate::Method::GET), - h1_parser_config, + h1_parser_config: &h1_parser_config, h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1821,7 +1821,7 @@ mod tests { let ctx = ParseContext { cached_headers: &mut None, req_method: &mut Some(crate::Method::GET), - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1849,7 +1849,7 @@ mod tests { let ctx = ParseContext { cached_headers: &mut None, req_method: &mut method, - h1_parser_config, + h1_parser_config: &h1_parser_config, h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1876,7 +1876,7 @@ mod tests { let ctx = ParseContext { cached_headers: &mut None, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1896,7 +1896,7 @@ mod tests { let ctx = ParseContext { cached_headers: &mut None, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: true, #[cfg(feature = "ffi")] @@ -1935,7 +1935,7 @@ mod tests { ParseContext { cached_headers: &mut None, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -1956,7 +1956,7 @@ mod tests { ParseContext { cached_headers: &mut None, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -2186,7 +2186,7 @@ mod tests { ParseContext { cached_headers: &mut None, req_method: &mut Some(Method::GET), - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -2207,7 +2207,7 @@ mod tests { ParseContext { cached_headers: &mut None, req_method: &mut Some(m), - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -2228,7 +2228,7 @@ mod tests { ParseContext { cached_headers: &mut None, req_method: &mut Some(Method::GET), - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -2798,7 +2798,7 @@ mod tests { ParseContext { cached_headers: &mut None, req_method: &mut Some(Method::GET), - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -2842,7 +2842,7 @@ mod tests { ParseContext { cached_headers: &mut None, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: max_headers, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -2866,7 +2866,7 @@ mod tests { ParseContext { cached_headers: &mut None, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: max_headers, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -3035,7 +3035,7 @@ mod tests { ParseContext { cached_headers: &mut headers, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")] @@ -3080,7 +3080,7 @@ mod tests { ParseContext { cached_headers: &mut headers, req_method: &mut None, - h1_parser_config: Default::default(), + h1_parser_config: &Default::default(), h1_max_headers: None, preserve_header_case: false, #[cfg(feature = "ffi")]