alibi_core/middleware/
mod.rs1pub mod body_limit;
2
3pub mod cors;
4
5pub mod csrf;
6
7pub mod rate_limit;
8
9use crate::error::AuthResult;
10use crate::types::{AuthRequest, AuthResponse};
11use async_trait::async_trait;
12pub use body_limit::{BodyLimitConfig, BodyLimitMiddleware};
13pub use cors::{CorsConfig, CorsMiddleware};
14pub use csrf::{CsrfConfig, CsrfMiddleware};
15pub use rate_limit::{
16 CacheRateLimitStorage, EndpointRateLimit, MemoryRateLimitStorage, PluginRateLimit,
17 RateLimitConfig, RateLimitDecision, RateLimitMiddleware, RateLimitResolver, RateLimitRule,
18 RateLimitStorage,
19};
20
21#[async_trait]
26pub trait Middleware: Send + Sync {
27 fn name(&self) -> &'static str;
29
30 async fn before_request(&self, req: &AuthRequest) -> AuthResult<Option<AuthResponse>>;
35
36 async fn after_request(
41 &self,
42 _req: &AuthRequest,
43 response: AuthResponse,
44 ) -> AuthResult<AuthResponse> {
45 Ok(response)
46 }
47}
48
49pub async fn run_before(
57 middlewares: &[Box<dyn Middleware>],
58 req: &AuthRequest,
59) -> AuthResult<Option<AuthResponse>> {
60 for mw in middlewares {
61 if let Some(response) = mw.before_request(req).await? {
62 return Ok(Some(response));
63 }
64 }
65 Ok(None)
66}
67
68pub async fn run_after(
74 middlewares: &[Box<dyn Middleware>],
75 req: &AuthRequest,
76 mut response: AuthResponse,
77) -> AuthResult<AuthResponse> {
78 for mw in middlewares.iter().rev() {
79 response = mw.after_request(req, response).await?;
80 }
81 Ok(response)
82}