httproxide 0.2.0

Rusted HTTP router reverse-proxy
Documentation
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<()> {
    //console_subscriber::init();
    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 {
        // An infinite stream of hangup signals.
        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;
    }
}