pub mod body_limit;
pub mod cors;
pub mod csrf;
pub mod rate_limit;
use crate::error::AuthResult;
use crate::types::{AuthRequest, AuthResponse};
use async_trait::async_trait;
#[async_trait]
pub trait Middleware: Send + Sync {
fn name(&self) -> &'static str;
async fn before_request(&self, req: &AuthRequest) -> AuthResult<Option<AuthResponse>>;
async fn after_request(
&self,
_req: &AuthRequest,
response: AuthResponse,
) -> AuthResult<AuthResponse> {
Ok(response)
}
}
pub async fn run_before(
middlewares: &[Box<dyn Middleware>],
req: &AuthRequest,
) -> AuthResult<Option<AuthResponse>> {
for mw in middlewares {
if let Some(response) = mw.before_request(req).await? {
return Ok(Some(response));
}
}
Ok(None)
}
pub async fn run_after(
middlewares: &[Box<dyn Middleware>],
req: &AuthRequest,
mut response: AuthResponse,
) -> AuthResult<AuthResponse> {
for mw in middlewares.iter().rev() {
response = mw.after_request(req, response).await?;
}
Ok(response)
}
pub use body_limit::{BodyLimitConfig, BodyLimitMiddleware};
pub use cors::{CorsConfig, CorsMiddleware};
pub use csrf::{CsrfConfig, CsrfMiddleware};
pub use rate_limit::{EndpointRateLimit, RateLimitConfig, RateLimitMiddleware};