reinhardt_dispatch/
middleware.rs1use reinhardt_core::exception::{Error, Result};
4use reinhardt_http::{Handler, Request, Response};
5use reinhardt_middleware::Middleware;
6use std::sync::Arc;
7
8const DEFAULT_MAX_MIDDLEWARE_DEPTH: usize = 256;
10
11pub struct MiddlewareChain {
13 handler: Arc<dyn Handler>,
14 middlewares: Vec<Arc<dyn Middleware>>,
15 max_depth: usize,
17}
18
19impl MiddlewareChain {
20 pub fn new(handler: Arc<dyn Handler>) -> Self {
22 Self {
23 handler,
24 middlewares: Vec::new(),
25 max_depth: DEFAULT_MAX_MIDDLEWARE_DEPTH,
26 }
27 }
28
29 pub fn with_max_depth(mut self, max_depth: usize) -> Self {
31 self.max_depth = max_depth;
32 self
33 }
34
35 pub fn add_middleware(mut self, middleware: Arc<dyn Middleware>) -> Result<Self> {
39 if self.middlewares.len() >= self.max_depth {
40 return Err(Error::ImproperlyConfigured(format!(
41 "middleware chain depth limit exceeded (max: {})",
42 self.max_depth
43 )));
44 }
45 self.middlewares.push(middleware);
46 Ok(self)
47 }
48
49 pub fn build(self) -> Arc<dyn Handler> {
51 let mut handler = self.handler;
52
53 for middleware in self.middlewares.into_iter().rev() {
54 handler = Arc::new(MiddlewareHandler {
55 middleware,
56 next: handler,
57 });
58 }
59
60 handler
61 }
62}
63
64struct MiddlewareHandler {
66 middleware: Arc<dyn Middleware>,
67 next: Arc<dyn Handler>,
68}
69
70#[async_trait::async_trait]
71impl Handler for MiddlewareHandler {
72 async fn handle(&self, request: Request) -> Result<Response> {
73 self.middleware.process(request, self.next.clone()).await
74 }
75}