Skip to main content

CredentialInjectionFilter

Struct CredentialInjectionFilter 

Source
pub struct CredentialInjectionFilter { /* private fields */ }
Expand description

Injects per-cluster API credentials into upstream requests.

For each configured cluster, injects a header (e.g. Authorization: Bearer sk-...) and optionally strips client-provided values for that header to prevent credential forwarding.

Credentials are resolved at construction time (inline values or environment variables). The filter matches on the cluster name selected by the router filter earlier in the pipeline.

§YAML configuration

filter: credential_injection
clusters:
  - name: provider-a
    header: Authorization
    env_var: PROVIDER_A_API_KEY
    header_prefix: "Bearer "
    strip_client_credential: true
  - name: internal
    header: x-api-key
    value: "internal-secret"

§Example

use praxis_filter::CredentialInjectionFilter;

let yaml: serde_yaml::Value = serde_yaml::from_str(
    r#"
clusters:
  - name: backend
    header: x-api-key
    value: "secret-123"
    strip_client_credential: true
"#,
)
.unwrap();
let filter = CredentialInjectionFilter::from_config(&yaml).unwrap();
assert_eq!(filter.name(), "credential_injection");

Implementations§

Source§

impl CredentialInjectionFilter

Source

pub fn from_config(config: &Value) -> Result<Box<dyn HttpFilter>, FilterError>

Create from YAML config.

Resolves all credentials (inline or from environment variables) at construction time so that per-request processing is a simple map lookup.

use praxis_filter::CredentialInjectionFilter;

let yaml: serde_yaml::Value = serde_yaml::from_str(
    r#"
clusters:
  - name: my-cluster
    header: Authorization
    value: "token-abc"
    header_prefix: "Bearer "
"#,
)
.unwrap();
let filter = CredentialInjectionFilter::from_config(&yaml).unwrap();
assert_eq!(filter.name(), "credential_injection");
§Errors

Returns FilterError if:

  • clusters is empty
  • Both value and env_var are set (or neither)
  • An env_var is not set in the environment

Trait Implementations§

Source§

impl HttpFilter for CredentialInjectionFilter

Source§

fn name(&self) -> &'static str

Unique name identifying this filter type (e.g. "router", "rate_limit").
Source§

fn on_request<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, ctx: &'life1 mut HttpFilterContext<'life2>, ) -> Pin<Box<dyn Future<Output = Result<FilterAction, FilterError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Called for each incoming request, in pipeline order.
Source§

fn on_response<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, ctx: &'life1 mut HttpFilterContext<'life2>, ) -> Pin<Box<dyn Future<Output = Result<FilterAction, FilterError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Called for each response, in reverse pipeline order. Read more
Source§

fn request_body_access(&self) -> BodyAccess

Declares what access this filter needs to request bodies. Read more
Source§

fn response_body_access(&self) -> BodyAccess

Declares what access this filter needs to response bodies. Read more
Source§

fn request_body_mode(&self) -> BodyMode

Declares the delivery mode for request body chunks. Read more
Source§

fn response_body_mode(&self) -> BodyMode

Declares the delivery mode for response body chunks. Read more
Source§

fn needs_request_context(&self) -> bool

Whether this filter needs the original request context during body phases. Read more
Source§

fn apply_insecure_options(&self, _options: &InsecureOptions)

Apply global InsecureOptions to this filter. Read more
Source§

fn compression_config(&self) -> Option<&CompressionConfig>

Returns the compression configuration if this filter enables response compression. Read more
Source§

fn on_request_body<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, ctx: &'life1 mut HttpFilterContext<'life2>, body: &'life3 mut Option<Bytes>, end_of_stream: bool, ) -> Pin<Box<dyn Future<Output = Result<FilterAction, FilterError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Called for each chunk of request body data, in pipeline order. Read more
Source§

fn on_response_body( &self, ctx: &mut HttpFilterContext<'_>, body: &mut Option<Bytes>, end_of_stream: bool, ) -> Result<FilterAction, FilterError>

Called for each chunk of response body data, in reverse pipeline order. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more