cardinal_plugins/
plugin_executor.rs

1use crate::container::PluginContainer;
2use crate::request_context::RequestContext;
3use crate::runner::MiddlewareResult;
4use cardinal_errors::CardinalError;
5use pingora::prelude::Session;
6use pingora::BError;
7use std::sync::Arc;
8
9#[async_trait::async_trait]
10pub trait CardinalPluginExecutor: Send + Sync {
11    async fn get_plugin_container(
12        &self,
13        _session: &mut Session,
14        req_ctx: &mut RequestContext,
15    ) -> pingora::Result<Arc<PluginContainer>, CardinalError>
16    where
17        Self: Send + Sync,
18    {
19        let filter_container = req_ctx.cardinal_context.get::<PluginContainer>().await?;
20        Ok(filter_container)
21    }
22
23    async fn can_run_plugin(
24        &self,
25        _binding_id: &str,
26        _session: &mut Session,
27        _req_ctx: &mut RequestContext,
28    ) -> Result<bool, BError>
29    where
30        Self: Send + Sync,
31    {
32        Ok(true)
33    }
34
35    async fn run_request_filter(
36        &self,
37        name: &str,
38        session: &mut Session,
39        req_ctx: &mut RequestContext,
40    ) -> Result<MiddlewareResult, CardinalError> {
41        let plugin_container = self.get_plugin_container(session, req_ctx).await?;
42        plugin_container
43            .run_request_filter(name, session, req_ctx)
44            .await
45    }
46
47    async fn run_response_filter(
48        &self,
49        name: &str,
50        session: &mut Session,
51        req_ctx: &mut RequestContext,
52        response: &mut pingora::http::ResponseHeader,
53    ) -> Result<(), CardinalError> {
54        let plugin_container = self.get_plugin_container(session, req_ctx).await?;
55
56        plugin_container
57            .run_response_filter(name, session, req_ctx, response)
58            .await;
59
60        Ok(())
61    }
62}