cardinal_plugins/
plugin_executor.rs1use 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}