use std::{convert::Infallible, net::SocketAddr}; use hyper::{server::conn::http1, service::service_fn}; use hyper_util::rt::TokioIo; use tokio::net::TcpListener; use dav_server::{fakels::FakeLs, localfs::LocalFs, DavHandler}; #[tokio::main] async fn main() { env_logger::init(); let dir = "/tmp"; let addr: SocketAddr = ([127, 0, 0, 1], 4918).into(); let dav_server = DavHandler::builder() .filesystem(LocalFs::new(dir, false, false, false)) .locksystem(FakeLs::new()) .build_handler(); let listener = TcpListener::bind(addr).await.unwrap(); println!("Listening {addr}"); // We start a loop to continuously accept incoming connections loop { let (stream, _) = listener.accept().await.unwrap(); let dav_server = dav_server.clone(); // Use an adapter to access something implementing `tokio::io` traits as if they implement // `hyper::rt` IO traits. let io = TokioIo::new(stream); // Spawn a tokio task to serve multiple connections concurrently tokio::task::spawn(async move { // Finally, we bind the incoming connection to our `hello` service if let Err(err) = http1::Builder::new() // `service_fn` converts our function in a `Service` .serve_connection( io, service_fn({ move |req| { let dav_server = dav_server.clone(); async move { Ok::<_, Infallible>(dav_server.handle(req).await) } } }), ) .await { eprintln!("Failed serving: {err:?}"); } }); } }