use crate::{ Responder, middleware::{Middleware, MiddlewareFuture, MiddlewareResult}, }; use http::Request; use hyper::body::Incoming; use log::warn; pub struct ApiKeyMiddleware { api_key: String, } impl ApiKeyMiddleware { pub fn new(api_key: &str) -> Self { Self { api_key: api_key.to_string(), } } } impl Middleware for ApiKeyMiddleware { fn run<'a>(&'a self, req: Request) -> MiddlewareFuture<'a> { let expected_key = self.api_key.clone(); Box::pin(async move { match req.headers().get("X-API-Key") { Some(header) => { if header == expected_key.as_str() { MiddlewareResult::Continue(req) } else { warn!("X-API-Key wrong"); MiddlewareResult::Respond(Responder::unauthorized().unwrap()) } } None => { warn!("X-API-Key missing"); MiddlewareResult::Respond(Responder::unauthorized().unwrap()) } } }) } }