Struct IoForwardService
pub struct IoForwardService { /* private fields */ }net only.Expand description
A proxy Service which takes a BridgeIo
and copies the bytes of both the source and target Ios
bidirectionally.
The service observes shutdown via the ShutdownGuard of the
Executor passed at construction (if any), enforces an optional
idle timeout that closes the bridge when neither direction has made
byte progress within the configured window, and emits a single
structured close event when the bridge ends.
Implementations§
§impl IoForwardService
impl IoForwardService
pub fn new(executor: Executor) -> IoForwardService
pub fn new(executor: Executor) -> IoForwardService
Create a new IoForwardService using the given Executor.
pub fn maybe_with_idle_timeout(
self,
timeout: Option<Duration>,
) -> IoForwardService
pub fn maybe_with_idle_timeout( self, timeout: Option<Duration>, ) -> IoForwardService
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
pub fn maybe_set_idle_timeout(
&mut self,
timeout: Option<Duration>,
) -> &mut IoForwardService
pub fn maybe_set_idle_timeout( &mut self, timeout: Option<Duration>, ) -> &mut IoForwardService
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
pub fn with_idle_timeout(self, timeout: Duration) -> IoForwardService
pub fn with_idle_timeout(self, timeout: Duration) -> IoForwardService
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
pub fn set_idle_timeout(&mut self, timeout: Duration) -> &mut IoForwardService
pub fn set_idle_timeout(&mut self, timeout: Duration) -> &mut IoForwardService
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
pub fn without_idle_timeout(self) -> IoForwardService
pub fn without_idle_timeout(self) -> IoForwardService
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
pub fn unset_idle_timeout(&mut self) -> &mut IoForwardService
pub fn unset_idle_timeout(&mut self) -> &mut IoForwardService
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
pub fn maybe_with_first_byte_timeout(
self,
timeout: Option<Duration>,
) -> IoForwardService
pub fn maybe_with_first_byte_timeout( self, timeout: Option<Duration>, ) -> IoForwardService
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
pub fn maybe_set_first_byte_timeout(
&mut self,
timeout: Option<Duration>,
) -> &mut IoForwardService
pub fn maybe_set_first_byte_timeout( &mut self, timeout: Option<Duration>, ) -> &mut IoForwardService
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
pub fn with_first_byte_timeout(self, timeout: Duration) -> IoForwardService
pub fn with_first_byte_timeout(self, timeout: Duration) -> IoForwardService
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
pub fn set_first_byte_timeout(
&mut self,
timeout: Duration,
) -> &mut IoForwardService
pub fn set_first_byte_timeout( &mut self, timeout: Duration, ) -> &mut IoForwardService
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
pub fn without_first_byte_timeout(self) -> IoForwardService
pub fn without_first_byte_timeout(self) -> IoForwardService
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
pub fn unset_first_byte_timeout(&mut self) -> &mut IoForwardService
pub fn unset_first_byte_timeout(&mut self) -> &mut IoForwardService
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
pub fn with_first_byte_timeout_start(
self,
start: FirstByteTimeoutStart,
) -> IoForwardService
pub fn with_first_byte_timeout_start( self, start: FirstByteTimeoutStart, ) -> IoForwardService
Anchor for the response first-byte window: see
FirstByteTimeoutStart. Only meaningful when
first_byte_timeout is set.
Default: FirstByteTimeoutStart::ClientFirstByte.
pub fn set_first_byte_timeout_start(
&mut self,
start: FirstByteTimeoutStart,
) -> &mut IoForwardService
pub fn set_first_byte_timeout_start( &mut self, start: FirstByteTimeoutStart, ) -> &mut IoForwardService
Anchor for the response first-byte window: see
FirstByteTimeoutStart. Only meaningful when
first_byte_timeout is set.
Default: FirstByteTimeoutStart::ClientFirstByte.
pub fn with_shutdown_grace(self, grace: Duration) -> IoForwardService
pub fn with_shutdown_grace(self, grace: Duration) -> IoForwardService
Per-half cap on graceful shutdown. When the bridge unwinds it calls
shutdown() on each write half bounded by this duration; if the
inner type blocks (e.g. a TLS layer waiting for close_notify),
the shutdown is abandoned and the half is dropped.
Default: 50ms.
pub fn set_shutdown_grace(&mut self, grace: Duration) -> &mut IoForwardService
pub fn set_shutdown_grace(&mut self, grace: Duration) -> &mut IoForwardService
Per-half cap on graceful shutdown. When the bridge unwinds it calls
shutdown() on each write half bounded by this duration; if the
inner type blocks (e.g. a TLS layer waiting for close_notify),
the shutdown is abandoned and the half is dropped.
Default: 50ms.
pub fn with_buf_size(self, size: usize) -> IoForwardService
pub fn with_buf_size(self, size: usize) -> IoForwardService
Per-direction copy buffer size (in bytes).
Default: 8 KiB.
pub fn set_buf_size(&mut self, size: usize) -> &mut IoForwardService
pub fn set_buf_size(&mut self, size: usize) -> &mut IoForwardService
Per-direction copy buffer size (in bytes).
Default: 8 KiB.
Trait Implementations§
§impl Clone for IoForwardService
impl Clone for IoForwardService
§fn clone(&self) -> IoForwardService
fn clone(&self) -> IoForwardService
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl Debug for IoForwardService
impl Debug for IoForwardService
§impl Default for IoForwardService
impl Default for IoForwardService
§fn default() -> IoForwardService
fn default() -> IoForwardService
§impl<S, T> Service<BridgeIo<S, T>> for IoForwardService
impl<S, T> Service<BridgeIo<S, T>> for IoForwardService
§type Output = IoForwardOutcome
type Output = IoForwardOutcome
§type Error = IoForwardError
type Error = IoForwardError
§async fn serve(
&self,
__arg1: BridgeIo<S, T>,
) -> Result<<IoForwardService as Service<BridgeIo<S, T>>>::Output, <IoForwardService as Service<BridgeIo<S, T>>>::Error>
async fn serve( &self, __arg1: BridgeIo<S, T>, ) -> Result<<IoForwardService as Service<BridgeIo<S, T>>>::Output, <IoForwardService as Service<BridgeIo<S, T>>>::Error>
§fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
Auto Trait Implementations§
impl Freeze for IoForwardService
impl RefUnwindSafe for IoForwardService
impl Send for IoForwardService
impl Sync for IoForwardService
impl Unpin for IoForwardService
impl UnsafeUnpin for IoForwardService
impl UnwindSafe for IoForwardService
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a rama_grpc::Request§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§fn and<P, B, E>(self, other: P) -> And<T, P>
fn and<P, B, E>(self, other: P) -> And<T, P>
Policy that returns Action::Follow only if self and other return
Action::Follow. Read more