pub struct CanaryLayer { /* private fields */ }Expand description
Weighted traffic-splitting proxy middleware.
Clone is cheap and shares state — all clones distribute traffic against
the same underlying [CanaryState], so a CanaryLayer::update on one
clone is immediately visible to a clone already wrapped into a running
Application (see the module docs for the clone-before-wrapping pattern).
Implementations§
Source§impl CanaryLayer
impl CanaryLayer
Sourcepub fn new(backends: Vec<WeightedBackend>) -> Self
pub fn new(backends: Vec<WeightedBackend>) -> Self
Build a CanaryLayer from the given weighted backends.
Backends with weight == 0 are ignored. Equivalent to
CanaryLayer::from_parts(backends, vec![]).
Sourcepub fn with_pools(pools: Vec<WeightedPool>) -> Self
pub fn with_pools(pools: Vec<WeightedPool>) -> Self
Build a CanaryLayer whose groups are all dynamically-discovered
BackendPools rather than fixed URLs. Equivalent to
CanaryLayer::from_parts(vec![], pools).
Sourcepub fn from_parts(
backends: Vec<WeightedBackend>,
pools: Vec<WeightedPool>,
) -> Self
pub fn from_parts( backends: Vec<WeightedBackend>, pools: Vec<WeightedPool>, ) -> Self
Build a CanaryLayer from a mix of fixed backends and dynamic pools.
Sourcepub fn add_pool(self, pool: BackendPool, weight: u32) -> Self
pub fn add_pool(self, pool: BackendPool, weight: u32) -> Self
Append one more dynamically-discovered group to an already-built
layer (e.g. adding a canary BackendPool alongside stable backends
passed to CanaryLayer::new). A weight of 0 is a no-op.
This is a builder method for use before .wrap(...) — for changing
an already-wrapped, already-running layer’s configuration, use
CanaryLayer::update instead.
Sourcepub fn update(&self, backends: Vec<WeightedBackend>, pools: Vec<WeightedPool>)
pub fn update(&self, backends: Vec<WeightedBackend>, pools: Vec<WeightedPool>)
Replace the entire backend/pool configuration in place — the runtime
equivalent of building a fresh layer with
CanaryLayer::from_parts, except every existing clone of this
layer (including one already wrapped into a running Application)
picks up the change on its very next request. No restart required.
Sourcepub fn path_prefix(self, prefix: impl Into<String>) -> Self
pub fn path_prefix(self, prefix: impl Into<String>) -> Self
Only proxy requests whose URI starts with prefix; pass others through.
Sourcepub fn connect_timeout_ms(self, ms: u64) -> Self
pub fn connect_timeout_ms(self, ms: u64) -> Self
Override the TCP connect timeout (default: 5 000 ms).
Sourcepub fn read_timeout_ms(self, ms: u64) -> Self
pub fn read_timeout_ms(self, ms: u64) -> Self
Override the response read timeout (default: 30 000 ms).
Trait Implementations§
Source§impl Clone for CanaryLayer
impl Clone for CanaryLayer
Source§impl Middleware for CanaryLayer
impl Middleware for CanaryLayer
fn handle( &self, request: &Request, connection: &ConnectionInfo, next: &dyn Application, ) -> Result<Response, String>
Source§fn runs_inline(&self, _request: &Request, _connection: &ConnectionInfo) -> bool
fn runs_inline(&self, _request: &Request, _connection: &ConnectionInfo) -> bool
true when this layer’s own work for request never blocks (in-memory
state, atomics, short mutexes) — see Application::runs_inline. A
WithMiddleware stack runs inline only if every layer and the inner
application agree. Default false.Source§fn is_passthrough(
&self,
_request: &Request,
_connection: &ConnectionInfo,
) -> bool
fn is_passthrough( &self, _request: &Request, _connection: &ConnectionInfo, ) -> bool
true when handle would do nothing for request but call next
(e.g. a rate limit that isn’t configured). A WithMiddleware stack
offers the inner application’s execute_async only if every layer
passes the request through. Default false.Source§fn accepts_streamed_body(
&self,
_request: &Request,
_connection: &ConnectionInfo,
) -> bool
fn accepts_streamed_body( &self, _request: &Request, _connection: &ConnectionInfo, ) -> bool
true when this layer never reads request.body, so the inner
application may receive it as a stream (Application::streams_body).
A layer that inspects the body (CSRF tokens in a form, request
signatures, rewriting) must keep the default false: it would see an
empty body.