sova-meta 0.1.2

Document meta, OG/Twitter, JSON-LD, sitemap and robots for Sova
Documentation
//! Trailing-slash 301 middleware.

use crate::canonical::apply_slash;
use crate::defaults::{MetaDefaults, TrailingSlash};
use sova_core::extend::named;
use sova_core::{App, IntoResponse, Next, Redirect, Request};

pub fn install_slash_middleware(app: &mut App) {
    app.use_middleware(named("meta-slash", |req: Request, next: Next| async move {
        let policy = req
            .try_state::<MetaDefaults>()
            .map(|d| d.trailing_slash)
            .unwrap_or(TrailingSlash::Keep);
        if policy == TrailingSlash::Keep || req.method != http::Method::GET {
            return next(req).await;
        }
        let normalized = apply_slash(&req.path, policy);
        if normalized != req.path {
            return Redirect::permanent(normalized).into_response();
        }
        next(req).await
    }));
}