found a way.
use one of actix middleware example
delete all the <B>
here's working example
use std::{
future::{ready, Ready},
rc::Rc
};
use actix_web::{
dev::{self, Service, ServiceRequest, ServiceResponse, Transform},
Error,
http::{header, StatusCode}, HttpResponseBuilder
};
use futures_util::future::LocalBoxFuture;
pub struct Auth;
impl<S: 'static> Transform<S, ServiceRequest> for Auth
where
S: Service<ServiceRequest, Response = ServiceResponse, Error = Error>,
S::Future: 'static
{
type Response = ServiceResponse;
type Error = Error;
type InitError = ();
type Transform = AuthMiddleware<S>;
type Future = Ready<Result<Self::Transform, Self::InitError>>;
fn new_transform(&self, service: S) -> Self::Future {
ready(Ok(AuthMiddleware {
service: Rc::new(service),
}))
}
}
pub struct AuthMiddleware<S> {
service: Rc<S>,
}
impl<S> Service<ServiceRequest> for AuthMiddleware<S>
where
S: Service<ServiceRequest, Response = ServiceResponse, Error = Error> + 'static,
S::Future: 'static
{
type Response = ServiceResponse;
type Error = Error;
type Future = LocalBoxFuture<'static, Result<Self::Response, Self::Error>>;
dev::forward_ready!(service);
fn call(&self, req: ServiceRequest) -> Self::Future {
let svc = self.service.clone();
Box::pin(async move {
let headers = req.headers();
let auth_header = match headers.get("Authorization") {
Some(e) => e,
None => {
let new_response = HttpResponseBuilder::new(StatusCode::BAD_REQUEST)
.insert_header((header::CONTENT_TYPE, "application/json"))
.json("Unauthorized xxx");
return Ok(ServiceResponse::new(
req.request().to_owned(),
new_response
))
}
};
let res = svc.call(req).await?;
Ok(res)
})
}
}