chiark / gitweb /
server: trace a bit more
[hippotat.git] / src / bin / server.rs
index fdee557433101a8fd33a634a3867d8c019c59dd8..ae130d8307960837b231a07d7dc0e6779b2330a9 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,14 +108,14 @@ 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
+    let comp = multipart::process_boundary
       (&mut warnings, &initial[start..], PartName::m)?
       .ok_or_else(|| anyhow!(r#"no "m" component"#))?;
 
@@ -122,7 +123,7 @@ async fn handle(
       r#"first multipart component must be name="m""#
     )) }
 
-    let mut meta = MetadataFieldIterator::new(comp.payload_start);
+    let mut meta = MetadataFieldIterator::new(comp.payload);
 
     let client: ClientName = meta.need_parse().context("client addr")?;
 
@@ -182,15 +183,16 @@ async fn handle(
     // boundary, start, &comp.name, &client.ic);
 
     let (reply_to, reply_recv) = tokio::sync::oneshot::channel();
+    trace!("{} request xxx={}", &client.ic, initial.len());
     let wreq = WebRequest {
       initial,
       initial_remaining,
       length_hint,
+      boundary_finder: boundary_finder.into_owned(),
       body,
       warnings: mem::take(&mut warnings),
       reply_to
     };
-    trace!("{} request", &client.ic);
 
     client.web.try_send(wreq)
       .map_err(|_| anyhow!("client task shut down!"))?;
@@ -213,6 +215,7 @@ async fn handle(
 }
 
 #[allow(unused_variables)] // xxx
+#[allow(unused_mut)] // xxx
 async fn run_client(ic: Arc<InstanceConfig>,
                     mut web: mpsc::Receiver<WebRequest>)
                     -> Result<Void, AE>
@@ -257,11 +260,14 @@ 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!"))?;
 
         match async {
 
+          let initial_used = initial.len() - initial_remaining;
+
           let whole_request = read_limited_bytes(
             ic.max_batch_up.sat(),
             initial,
@@ -269,13 +275,52 @@ async fn run_client(ic: Arc<InstanceConfig>,
             &mut body
           ).await.context("read request body")?;
 
-          dbg!(whole_request.len());
-
-/*          
-
-          multipart::ComponentIterator::resume_mid_component(
-            &initial[initial_remaining..],
-  */          
+          let (meta, comps) =
+            multipart::ComponentIterator::resume_mid_component(
+              &whole_request[initial_used..],
+              boundary_finder
+            ).context("resume parsing body, after auth checks")?;
+
+          let mut meta = MetadataFieldIterator::new(&meta);
+
+          macro_rules! meta {
+            { $v:ident, ( $( $badcmp:tt )? ), $ret:expr,
+              let $server:ident, $client:ident $($code:tt)*
+            } => {
+              let $v = (||{
+                let $server = ic.$v;
+                let $client $($code)*
+                $(
+                  if $client $badcmp $server {
+                    throw!(anyhow!("mismatch: client={:?} {} server={:?}",
+                                   $client, stringify!($badcmp), $server));
+                  }
+                )?
+                Ok::<_,AE>($ret)
+              })().context(stringify!($v))?;
+              dbg!(&$v);
+            }
+          }
+
+          meta!{
+            target_requests_outstanding, ( != ), client,
+            let server, client: u32 = meta.need_parse()?;
+          }
+
+          meta!{
+            http_timeout, ( > ), client,
+            let server, client = Duration::from_secs(meta.need_parse()?);
+          }
+
+          meta!{
+            max_batch_down, (), min(client, server),
+            let server, client: u32 = meta.parse()?.unwrap_or(server);
+          }
+
+          meta!{
+            max_batch_up, ( > ), client,
+            let server, client = meta.parse()?.unwrap_or(server);
+          }
 
           Ok::<_,AE>(())
         }.await {