shield_actix/
service.rs

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
use std::task::{Context, Poll};

use actix_web::{
    dev::{Service, ServiceRequest, ServiceResponse},
    Error, HttpMessage,
};
use shield::{Shield, User};

pub struct ShieldService<S, U: User> {
    inner: S,
    shield: Shield<U>,
}

impl<S, U: User> ShieldService<S, U> {
    pub fn new(inner: S, shield: Shield<U>) -> Self {
        Self { inner, shield }
    }
}

impl<S, U: User + Clone + 'static, ResBody> Service<ServiceRequest> for ShieldService<S, U>
where
    S: Service<ServiceRequest, Response = ServiceResponse<ResBody>, Error = Error>,
{
    type Response = ServiceResponse<ResBody>;
    type Error = Error;
    type Future = S::Future;

    fn poll_ready(&self, ctx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
        self.inner.poll_ready(ctx)
    }

    fn call(&self, req: ServiceRequest) -> Self::Future {
        req.extensions_mut().insert(self.shield.clone());
        self.inner.call(req)
    }
}