1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use crate::{HandleFuture, MiddlewareItem, Request};
use std::sync::Arc;
pub trait Middleware {
fn handle<'m>(&'m self, req: &'m mut Request, chain: Chain<'m>) -> HandleFuture<'m>;
}
pub struct Chain<'a> {
#[allow(clippy::borrowed_box)]
pub(crate) handler: &'a Box<dyn Fn(&mut Request) -> HandleFuture + Send + Sync + 'static>,
pub(crate) middlewares: &'a [Arc<MiddlewareItem>],
}
impl<'a> Chain<'a> {
pub fn run(mut self, req: &'a mut Request) -> HandleFuture<'a> {
if let Some((current, chain)) = self.middlewares.split_first() {
self.middlewares = chain;
current.handle(req, self)
} else {
(self.handler)(req)
}
}
}
mod content_type;
mod headers_default;
mod request_logger;
mod runtime;
pub mod cookie_parser;
pub mod session;
pub use content_type::ContentType;
pub use headers_default::HeadersDefault;
pub use request_logger::RequestLogger;
pub use runtime::Runtime;