chiark / gitweb /
server wip meta
[hippotat.git] / src / bin / server.rs
index 1fd6695127ae2a2d3531856f0555632a8332bc47..bb1c6d6736112d5f5af0ba3a9f00bbf11481cb9f 100644 (file)
@@ -215,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>
@@ -272,13 +273,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_remaining..],
+              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 {