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.
75 lines
1.2 KiB
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(())
|
|
}
|