chiark / gitweb /
server: boundary_finder plumbing
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 15 Aug 2021 17:51:21 +0000 (18:51 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 15 Aug 2021 17:53:06 +0000 (18:53 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/server.rs
src/multipart.rs

index fdee557433101a8fd33a634a3867d8c019c59dd8..d8bd514d893e939fe4f60e9fa7aeeee55373877a 100644 (file)
@@ -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<WebResponse>,
   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<InstanceConfig>,
       {
         let WebRequest {
           initial, initial_remaining, length_hint, mut body,
+          boundary_finder,
           reply_to, warnings,
         } = req.ok_or_else(|| anyhow!("webservers all shut down!"))?;
 
index 9f3fca9fade6b2533c35161f6e704e7fdcd2f35f..b858039c73e782c6993442548e70bf08c9f9be99 100644 (file)
@@ -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)