use std::sync::Arc;
use axum::body::Body;
use axum::extract::Request;
use axum::http::header;
use axum::middleware::Next;
use axum::response::Response;
use crate::state::AppState;
const OG_PLACEHOLDER: &str = r#""#;
pub async fn og_middleware(request: Request, next: Next) -> Response {
// Capture the query string before passing the request through
let query_string = request.uri().query().unwrap_or("").to_string();
// Get state from extensions
let state = request.extensions().get::>().cloned();
let response = next.run(request).await;
let content_type = response
.headers()
.get(header::CONTENT_TYPE)
.and_then(|val| val.to_str().ok())
.unwrap_or("");
if !content_type.contains("text/html") {
return response;
}
let state = match state {
Some(st) => st,
None => return response,
};
let index_html = match &state.index_html {
Some(html) => html,
None => return response,
};
// Build OG-injected HTML
let og_image_url = if query_string.is_empty() {
format!("{}/api/og-image", state.public_url)
} else {
format!("{}/api/og-image?{}", state.public_url, query_string)
};
let og_tags = format!(
r#"
"#
);
let html = index_html.replace(OG_PLACEHOLDER, &og_tags);
let (parts, _body) = response.into_parts();
Response::from_parts(parts, Body::from(html))
}