From: Ian Jackson Date: Sun, 15 Aug 2021 17:51:21 +0000 (+0100) Subject: server: boundary_finder plumbing X-Git-Tag: hippotat/1.0.0~173 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=e582487c6e131e58b4de471d74aad84c8704f43b;hp=407e6511edc91f4eca3170eb0b80a96a6199a6f3;p=hippotat.git server: boundary_finder plumbing Signed-off-by: Ian Jackson --- diff --git a/src/bin/server.rs b/src/bin/server.rs index fdee557..d8bd514 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -32,6 +32,7 @@ struct WebRequest { initial_remaining: usize, length_hint: usize, body: hyper::body::Body, + boundary_finder: multipart::BoundaryFinder, reply_to: tokio::sync::oneshot::Sender, warnings: Warnings, } @@ -107,11 +108,11 @@ async fn handle( Err(ReadLimitedError::Hyper(e)) => throw!(e), }; - let finder = memmem::Finder::new(&boundary); - let mut find_iter = finder.find_iter(&initial); + let boundary_finder = memmem::Finder::new(&boundary); + let mut boundary_iter = boundary_finder.find_iter(&initial); let start = if initial.starts_with(&boundary[1..]) { boundary.len()-1 } - else if let Some(start) = find_iter.next() { start + boundary.len() } + else if let Some(start) = boundary_iter.next() { start + boundary.len() } else { throw!(anyhow!("initial boundary not found")) }; let comp = multipart::process_component @@ -186,6 +187,7 @@ async fn handle( initial, initial_remaining, length_hint, + boundary_finder: boundary_finder.into_owned(), body, warnings: mem::take(&mut warnings), reply_to @@ -257,6 +259,7 @@ async fn run_client(ic: Arc, { let WebRequest { initial, initial_remaining, length_hint, mut body, + boundary_finder, reply_to, warnings, } = req.ok_or_else(|| anyhow!("webservers all shut down!"))?; diff --git a/src/multipart.rs b/src/multipart.rs index 9f3fca9..b858039 100644 --- a/src/multipart.rs +++ b/src/multipart.rs @@ -15,6 +15,8 @@ pub struct Component<'b> { #[allow(non_camel_case_types)] pub enum PartName { m, d, Other } +pub type BoundaryFinder = memchr::memmem::Finder<'static>; + #[throws(AE)] pub fn process_component<'b>(warnings: &mut Warnings, after_leader: &'b [u8], expected: PartName)