43 lines
1.1 KiB
Rust
43 lines
1.1 KiB
Rust
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<Incoming>) -> 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())
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|