use futures_util::future::select_all;
use httproxide::config;
use httproxide::listener::listener_config;
use tokio::signal::unix::{signal, SignalKind};
use tokio::sync::mpsc;
#[cfg(feature = "mimalloc")]
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
#[tokio::main(flavor = "current_thread")]
async fn main() -> anyhow::Result<()> {
env_logger::init();
let config_path = config::path_from_args();
let (reload_tx, mut reload_rx) = mpsc::unbounded_channel();
httproxide::reload::RELOAD.set(reload_tx).unwrap();
tokio::spawn(async {
let mut s = signal(SignalKind::hangup()).unwrap();
loop {
s.recv().await;
httproxide::reload::reload();
}
});
loop {
let config: config::Config = serde_yaml::from_slice(&tokio::fs::read(&config_path).await?)?;
println!("{:#?}", config);
let listeners = config
.listeners
.into_iter()
.map(listener_config)
.collect::<anyhow::Result<Vec<_>>>()?;
tokio::select! {
_ = reload_rx.recv() => {
log::info!("config reload");
}
res = select_all(listeners) => {
return res.0;
}
}
#[cfg(feature = "tls-util")]
httproxide::tls_util::clear_cache().await;
}
}