You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yuurei/src/web/mod.rs

75 lines
1.2 KiB

//! Handle web serving and managing state of web clients
use super::*;
use std::{
sync::Arc,
};
use hyper::{
service::{
make_service_fn,
service_fn,
},
server::{
Server,
conn::AddrStream,
},
Request,
Response,
Body,
};
use futures::{
TryStreamExt as _,
};
#[derive(Debug)]
pub struct State
{
}
impl State
{
pub fn new() -> Self
{
Self{}
}
}
async fn test(req: Request<Body>) -> Result<Response<Body>, !>
{
Ok(Response::new("Hi".into()))
}
pub async fn serve(state: State) -> Result<(), eyre::Report>
{
let state = Arc::new(state);
let (addr, accept, deny) = {
let cfg =config::get();
(cfg.listen,
cfg.accept_mask.clone(),
cfg.deny_mask.clone())
};
let service = make_service_fn(|conn: &AddrStream| {
let state = Arc::clone(&state);
let remote_addr = conn.remote_addr();
// TODO: Match config allow and deny masks
async move {
Ok::<_, !>(service_fn(test))
}
});
let server = Server::bind(&addr).serve(service)
.with_graceful_shutdown(async {
tokio::signal::ctrl_c().await.expect("Failed to catch SIGINT");
});
server.await?;
Ok(())
}