pub trait Middleware<E: Endpoint> {
    type Output: Endpoint;

    // Required method
    fn transform(&self, ep: E) -> Self::Output;
}
Expand description

Represents a middleware trait.

§Create you own middleware

use poem::{
    handler, test::TestClient, web::Data, Endpoint, EndpointExt, Middleware, Request, Result,
};

/// A middleware that extract token from HTTP headers.
struct TokenMiddleware;

impl<E: Endpoint> Middleware<E> for TokenMiddleware {
    type Output = TokenMiddlewareImpl<E>;

    fn transform(&self, ep: E) -> Self::Output {
        TokenMiddlewareImpl { ep }
    }
}

/// The new endpoint type generated by the TokenMiddleware.
struct TokenMiddlewareImpl<E> {
    ep: E,
}

const TOKEN_HEADER: &str = "X-Token";

/// Token data
#[derive(Clone)]
struct Token(String);

impl<E: Endpoint> Endpoint for TokenMiddlewareImpl<E> {
    type Output = E::Output;

    async fn call(&self, mut req: Request) -> Result<Self::Output> {
        if let Some(value) = req
            .headers()
            .get(TOKEN_HEADER)
            .and_then(|value| value.to_str().ok())
        {
            // Insert token data to extensions of request.
            let token = value.to_string();
            req.extensions_mut().insert(Token(token));
        }

        // call the next endpoint.
        self.ep.call(req).await
    }
}

#[handler]
async fn index(Data(token): Data<&Token>) -> String {
    token.0.clone()
}

// Use the `TokenMiddleware` middleware to convert the `index` endpoint.
let ep = index.with(TokenMiddleware);

let mut resp = TestClient::new(ep)
    .get("/")
    .header(TOKEN_HEADER, "abc")
    .send()
    .await;
resp.assert_status_is_ok();
resp.assert_text("abc").await;

§Create middleware with functions

use std::sync::Arc;

use poem::{
    handler, test::TestClient, web::Data, Endpoint, EndpointExt, IntoResponse, Request, Result,
};
const TOKEN_HEADER: &str = "X-Token";

#[handler]
async fn index(Data(token): Data<&Token>) -> String {
    token.0.clone()
}

/// Token data
#[derive(Clone)]
struct Token(String);

async fn token_middleware<E: Endpoint>(next: E, mut req: Request) -> Result<E::Output> {
    if let Some(value) = req
        .headers()
        .get(TOKEN_HEADER)
        .and_then(|value| value.to_str().ok())
    {
        // Insert token data to extensions of request.
        let token = value.to_string();
        req.extensions_mut().insert(Token(token));
    }

    // call the next endpoint.
    next.call(req).await
}

let ep = index.around(token_middleware);
let cli = TestClient::new(ep);

let resp = cli.get("/").header(TOKEN_HEADER, "abc").send().await;
resp.assert_status_is_ok();
resp.assert_text("abc").await;

Required Associated Types§

source

type Output: Endpoint

New endpoint type.

If you don’t know what type to use, then you can use BoxEndpoint, which will bring some performance loss, but it is insignificant.

Required Methods§

source

fn transform(&self, ep: E) -> Self::Output

Transform the input Endpoint to another one.

Implementations on Foreign Types§

source§

impl<E, T1, T2> Middleware<E> for (T1, T2)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>,

§

type Output = <T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3> Middleware<E> for (T1, T2, T3)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>,

§

type Output = <T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4> Middleware<E> for (T1, T2, T3, T4)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>,

§

type Output = <T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5> Middleware<E> for (T1, T2, T3, T4, T5)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>,

§

type Output = <T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6> Middleware<E> for (T1, T2, T3, T4, T5, T6)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>,

§

type Output = <T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>,

§

type Output = <T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7, T8> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7, T8)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>, T8: Middleware<T7::Output>,

§

type Output = <T8 as Middleware<<T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7, T8, T9> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7, T8, T9)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>, T8: Middleware<T7::Output>, T9: Middleware<T8::Output>,

§

type Output = <T9 as Middleware<<T8 as Middleware<<T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>, T8: Middleware<T7::Output>, T9: Middleware<T8::Output>, T10: Middleware<T9::Output>,

§

type Output = <T10 as Middleware<<T9 as Middleware<<T8 as Middleware<<T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>, T8: Middleware<T7::Output>, T9: Middleware<T8::Output>, T10: Middleware<T9::Output>, T11: Middleware<T10::Output>,

§

type Output = <T11 as Middleware<<T10 as Middleware<<T9 as Middleware<<T8 as Middleware<<T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>, T8: Middleware<T7::Output>, T9: Middleware<T8::Output>, T10: Middleware<T9::Output>, T11: Middleware<T10::Output>, T12: Middleware<T11::Output>,

§

type Output = <T12 as Middleware<<T11 as Middleware<<T10 as Middleware<<T9 as Middleware<<T8 as Middleware<<T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>, T8: Middleware<T7::Output>, T9: Middleware<T8::Output>, T10: Middleware<T9::Output>, T11: Middleware<T10::Output>, T12: Middleware<T11::Output>, T13: Middleware<T12::Output>,

§

type Output = <T13 as Middleware<<T12 as Middleware<<T11 as Middleware<<T10 as Middleware<<T9 as Middleware<<T8 as Middleware<<T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>, T8: Middleware<T7::Output>, T9: Middleware<T8::Output>, T10: Middleware<T9::Output>, T11: Middleware<T10::Output>, T12: Middleware<T11::Output>, T13: Middleware<T12::Output>, T14: Middleware<T13::Output>,

§

type Output = <T14 as Middleware<<T13 as Middleware<<T12 as Middleware<<T11 as Middleware<<T10 as Middleware<<T9 as Middleware<<T8 as Middleware<<T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>, T8: Middleware<T7::Output>, T9: Middleware<T8::Output>, T10: Middleware<T9::Output>, T11: Middleware<T10::Output>, T12: Middleware<T11::Output>, T13: Middleware<T12::Output>, T14: Middleware<T13::Output>, T15: Middleware<T14::Output>,

§

type Output = <T15 as Middleware<<T14 as Middleware<<T13 as Middleware<<T12 as Middleware<<T11 as Middleware<<T10 as Middleware<<T9 as Middleware<<T8 as Middleware<<T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

source§

impl<E, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> Middleware<E> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)
where E: Endpoint, T1: Middleware<E>, T2: Middleware<T1::Output>, T3: Middleware<T2::Output>, T4: Middleware<T3::Output>, T5: Middleware<T4::Output>, T6: Middleware<T5::Output>, T7: Middleware<T6::Output>, T8: Middleware<T7::Output>, T9: Middleware<T8::Output>, T10: Middleware<T9::Output>, T11: Middleware<T10::Output>, T12: Middleware<T11::Output>, T13: Middleware<T12::Output>, T14: Middleware<T13::Output>, T15: Middleware<T14::Output>, T16: Middleware<T15::Output>,

§

type Output = <T16 as Middleware<<T15 as Middleware<<T14 as Middleware<<T13 as Middleware<<T12 as Middleware<<T11 as Middleware<<T10 as Middleware<<T9 as Middleware<<T8 as Middleware<<T7 as Middleware<<T6 as Middleware<<T5 as Middleware<<T4 as Middleware<<T3 as Middleware<<T2 as Middleware<<T1 as Middleware<E>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output>>::Output

source§

fn transform(&self, ep: E) -> Self::Output

Implementors§

source§

impl<E> Middleware<E> for CookieJarManager
where E: Endpoint,

source§

impl<E> Middleware<E> for ForceHttps
where E: Endpoint,

§

type Output = ForceHttpsEndpoint<E>

source§

impl<E, T> Middleware<E> for AddData<T>
where E: Endpoint, T: Clone + Send + Sync + 'static,

source§

impl<E: Endpoint> Middleware<E> for CookieSession

Available on crate feature session only.
source§

impl<E: Endpoint> Middleware<E> for Compression

source§

impl<E: Endpoint> Middleware<E> for Cors

source§

impl<E: Endpoint> Middleware<E> for Csrf

source§

impl<E: Endpoint> Middleware<E> for NormalizePath

source§

impl<E: Endpoint> Middleware<E> for OpenTelemetryMetrics

source§

impl<E: Endpoint> Middleware<E> for PropagateHeader

source§

impl<E: Endpoint> Middleware<E> for SensitiveHeader

source§

impl<E: Endpoint> Middleware<E> for SetHeader

source§

impl<E: Endpoint> Middleware<E> for SizeLimit

source§

impl<E: Endpoint> Middleware<E> for TokioMetrics

source§

impl<E: Endpoint> Middleware<E> for Tracing

source§

impl<E: Endpoint, H: PanicHandler> Middleware<E> for CatchPanic<H>

source§

impl<T, E> Middleware<E> for OpenTelemetryTracing<T>
where T: Tracer + Send + Sync, T::Span: Send + Sync + 'static, E: Endpoint,

source§

impl<T, E, E2> Middleware<E> for FnMiddleware<T>
where T: Fn(E) -> E2, E: Endpoint, E2: Endpoint,

§

type Output = E2

source§

impl<T: SessionStorage, E: Endpoint> Middleware<E> for ServerSession<T>

Available on crate feature session only.