Skip to main content

reinhardt_dispatch/
middleware.rs

1//! Middleware system for request/response processing pipeline.
2
3use reinhardt_core::exception::{Error, Result};
4use reinhardt_http::{Handler, Request, Response};
5use reinhardt_middleware::Middleware;
6use std::sync::Arc;
7
8/// Default maximum number of middleware components in a chain.
9const DEFAULT_MAX_MIDDLEWARE_DEPTH: usize = 256;
10
11/// A middleware chain that composes multiple middleware components with a handler.
12pub struct MiddlewareChain {
13	handler: Arc<dyn Handler>,
14	middlewares: Vec<Arc<dyn Middleware>>,
15	/// Maximum number of middleware components allowed in the chain.
16	max_depth: usize,
17}
18
19impl MiddlewareChain {
20	/// Creates a new middleware chain with the given handler.
21	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	/// Sets the maximum number of middleware components allowed in the chain.
30	pub fn with_max_depth(mut self, max_depth: usize) -> Self {
31		self.max_depth = max_depth;
32		self
33	}
34
35	/// Adds a middleware to the chain.
36	///
37	/// Returns an error if adding the middleware would exceed the maximum depth.
38	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	/// Builds the final handler by composing all middleware.
50	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
64/// Internal handler that wraps a middleware with its next handler.
65struct 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}