actix_rewrite/
factory.rs

1use std::future::{Ready, ready};
2use std::rc::Rc;
3
4use actix_web::{
5    Error,
6    body::BoxBody,
7    dev::{Service, ServiceRequest, ServiceResponse, Transform},
8};
9
10use crate::rewrite::Engine;
11use crate::service::{RewriteInner, RewriteService};
12
13/// `mod_rewrite` middleware service
14///
15/// `Middleware` must be registered with `App::wrap()` method.
16///
17/// # Examples
18///
19/// ```
20/// use actix_web::App;
21/// use actix_rewrite::{Middleware, Engine};
22///
23/// let mut engine = Engine::new();
24/// engine.add_rules(r#"
25///     RewriteRule /file/(.*)     /tmp/$1      [L]
26///     RewriteRule /redirect/(.*) /location/$1 [R=302]
27///     RewriteRule /blocked/(.*)  -            [F]
28/// "#).expect("failed to process rules");
29///
30/// let app = App::new().wrap(Middleware::new(engine));
31/// ```
32pub struct Middleware(Rc<Engine>);
33
34impl Middleware {
35    /// Creates a new `mod_rewrite` middleware instance
36    #[inline]
37    pub fn new(engine: Engine) -> Self {
38        Self(Rc::new(engine))
39    }
40}
41
42impl From<Engine> for Middleware {
43    #[inline]
44    fn from(value: Engine) -> Self {
45        Self::new(value)
46    }
47}
48
49impl<S> Transform<S, ServiceRequest> for Middleware
50where
51    S: Service<ServiceRequest, Response = ServiceResponse<BoxBody>, Error = Error> + 'static,
52    S::Future: 'static,
53{
54    type Response = ServiceResponse<BoxBody>;
55    type Error = Error;
56    type InitError = ();
57    type Transform = RewriteService<S>;
58    type Future = Ready<Result<Self::Transform, Self::InitError>>;
59
60    fn new_transform(&self, service: S) -> Self::Future {
61        ready(Ok(RewriteService(Rc::new(RewriteInner {
62            service: Rc::new(service),
63            engine: self.0.clone(),
64        }))))
65    }
66}