1.1 KiB · text History b85db9e
//! Shared HTTP serving helpers.

use anyhow::Result;
use esp_idf_svc::http::server::EspHttpServer;
use esp_idf_svc::http::Method;
use esp_idf_svc::io::Write as _;

use crate::assets::Asset;

/// Register a static, pre-compressed asset at `uri`.
pub fn serve_asset(server: &mut EspHttpServer<'static>, uri: &str, asset: Asset) -> Result<()> {
    server.fn_handler(uri, Method::Get, move |req| {
        req.into_response(200, Some("OK"), asset.headers)?
            .write_all(asset.bytes)?;
        Ok::<(), anyhow::Error>(())
    })?;
    Ok(())
}

/// Register the shared style shell (CSS + fonts) that every page links.
pub fn serve_shell(server: &mut EspHttpServer<'static>) -> Result<()> {
    for (uri, asset) in crate::assets::SHELL {
        serve_asset(server, uri, *asset)?;
    }
    Ok(())
}

/// Register a `302` redirect from `uri` to `target`.
pub fn serve_redirect(
    server: &mut EspHttpServer<'static>,
    uri: &str,
    target: &'static str,
) -> Result<()> {
    server.fn_handler(uri, Method::Get, move |req| {
        req.into_response(302, Some("Found"), &[("Location", target)])?;
        Ok::<(), anyhow::Error>(())
    })?;
    Ok(())
}