1 // Copyright 2021 Ian Jackson and contributors to Hippotat
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 // There is NO WARRANTY.
5 use hippotat::prelude::*;
7 #[derive(StructOpt,Debug)]
20 _req: hyper::Request<hyper::Body>
21 ) -> Result<hyper::Response<hyper::Body>, Infallible> {
23 let (boundary, warning) = (||{
24 let mut ctypes = req.headers().get_all();
25 let t = ctypes.next().ok_or_else(|| anyhow!("missing Content-Type"))?;
26 if ctypes.next().is_soe() { throw!(anyhow!("several Content-Type")) }
27 let t: mime::Mime = t.parse().context("parse Content-Type")?;
28 if t.type_() != "multipart" { throw!(anyhow!("not multipart/")) }
29 let b = t.get_param(mime::BOUNDARY).context("missing boundary=...")?;
31 if t.subtype != "form-data" { throw!(anyhow("not multipart/form-data")) }
34 Ok::<_,AE>((b, warning))
35 }()).unwrap_or_else(|e| {
36 ("b", Err(e.context("guessing boundary")))
39 eprintln!("boundary={} warning={}", boundary, warning);
42 Ok(hyper::Response::new(hyper::Body::from("Hello World")))
48 let opts = Opts::from_args();
49 let mut hservers = vec![];
50 let (ics,(global,ipif)) = config::startup(
51 "hippotatd", LinkEnd::Server,
52 &opts.config, &opts.log, |ics|
54 let global = config::InstanceConfigGlobal::from(&ics);
55 let ipif = Ipif::start(&global.ipif, None)?;
57 let make_service = hyper::service::make_service_fn(|_conn| async {
58 Ok::<_, Infallible>(hyper::service::service_fn(handle))
61 for addr in &global.addrs {
62 let addr = SocketAddr::new(*addr, global.port);
63 let server = hyper::Server::try_bind(&addr)
65 .http1_preserve_header_case(true)
67 info!("listening on {}", &addr);
68 let task = tokio::task::spawn(server);
75 let x = future::select_all(&mut hservers).await;
76 error!("xxx hserver {:?}", &x);
78 ipif.quitting(None).await;