Skip to main content

RouterFilter

Struct RouterFilter 

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

Routes requests to clusters based on path prefix and host header.

If a preceding filter (such as path_rewrite or url_rewrite) has set rewritten_path, the router matches against the rewritten path. Otherwise, it uses the original request path.

Sets ctx.cluster for downstream filters but does not pick an endpoint or forward the request. The load_balancer filter reads ctx.cluster to select an endpoint.

Longest prefix wins. Routes without host match any host. Header restrictions use AND semantics with case-sensitive matching.

§YAML configuration

filter: router
routes:
  - path_prefix: "/"
    cluster: default

§Example

use praxis_filter::RouterFilter;

let yaml: serde_yaml::Value = serde_yaml::from_str(
    r#"
routes:
  - path_prefix: "/"
    cluster: default
"#,
)
.unwrap();
let filter = RouterFilter::from_config(&yaml).unwrap();
assert_eq!(filter.name(), "router");

Implementations§

Source§

impl RouterFilter

Source

pub fn new(routes: Vec<Route>) -> Result<Self, FilterError>

Create a router from a list of routes with default alias options.

Path prefix matching uses segment-boundary semantics per Gateway API: /api matches /api, /api/, /api/v1 but NOT /apikeys. Trailing slashes on prefixes are ignored (/api is equivalent to /api/).

use praxis_core::config::{PathMatch, Route};
use praxis_filter::RouterFilter;

let router = RouterFilter::new(vec![
    Route {
        path_match: PathMatch::Prefix {
            path_prefix: "/".to_owned(),
        },
        host: None,
        headers: None,
        cluster: "default".into(),
    },
    Route {
        path_match: PathMatch::Prefix {
            path_prefix: "/api".to_owned(),
        },
        host: None,
        headers: None,
        cluster: "api".into(),
    },
])
.unwrap();
§Errors

Returns FilterError if alias configuration is invalid.

Source

pub fn with_multi_level_subdomain_matching(self, enabled: bool) -> Self

Enable multi-level subdomain matching for wildcard hosts.

By default, *.example.com matches only foo.example.com. When enabled, it also matches foo.bar.example.com (suffix match), as required by Gateway API.

Source

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

Create a router from parsed YAML config.

§Errors

Returns FilterError if route YAML is invalid or routes fail validation.

Trait Implementations§

Source§

impl Debug for RouterFilter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl HttpFilter for RouterFilter

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