Struct SniRouter
pub struct SniRouter<S, F = RejectService<(), NoTlsRejectError>> { /* private fields */ }tls only.Expand description
A Service router that can be used to support
routing of tls traffic as well as non-tls traffic.
The difference with TlsPeekRouter is that the SniRouter
continues to parse after the initial couple of bytes,
in order to learn more about underlying traffic. This allowing
you to route based on the SNI from the client hello,
among other capabilities.
By default non-tls traffic is rejected using RejectService.
Use SniRouter::with_fallback to configure the fallback service.
A definitive non-TLS or malformed ClientHello prefix invokes that fallback
under either timeout policy; an inconclusive timeout is fail-open by default
and can be made fail-closed with SniRouter::with_peek_timeout_policy.
Implementations§
§impl<S, F> SniRouter<S, F>
impl<S, F> SniRouter<S, F>
pub fn maybe_with_peek_timeout(
self,
peek_timeout: Option<Duration>,
) -> SniRouter<S, F>
pub fn maybe_with_peek_timeout( self, peek_timeout: Option<Duration>, ) -> SniRouter<S, F>
Set an optional timeout on the ClientHello peek.
Defaults to None (no timeout). A valid-but-partial ClientHello from
an idle peer otherwise blocks until EOF; set a timeout for untrusted
ingress. Use SniRouter::with_peek_timeout_policy to choose whether
an inconclusive timeout invokes the fallback or rejects the connection.
pub fn maybe_set_peek_timeout(
&mut self,
peek_timeout: Option<Duration>,
) -> &mut SniRouter<S, F>
pub fn maybe_set_peek_timeout( &mut self, peek_timeout: Option<Duration>, ) -> &mut SniRouter<S, F>
Set an optional timeout on the ClientHello peek.
Defaults to None (no timeout). A valid-but-partial ClientHello from
an idle peer otherwise blocks until EOF; set a timeout for untrusted
ingress. Use SniRouter::with_peek_timeout_policy to choose whether
an inconclusive timeout invokes the fallback or rejects the connection.
pub fn with_peek_timeout(self, peek_timeout: Duration) -> SniRouter<S, F>
pub fn with_peek_timeout(self, peek_timeout: Duration) -> SniRouter<S, F>
Set an optional timeout on the ClientHello peek.
Defaults to None (no timeout). A valid-but-partial ClientHello from
an idle peer otherwise blocks until EOF; set a timeout for untrusted
ingress. Use SniRouter::with_peek_timeout_policy to choose whether
an inconclusive timeout invokes the fallback or rejects the connection.
pub fn set_peek_timeout(
&mut self,
peek_timeout: Duration,
) -> &mut SniRouter<S, F>
pub fn set_peek_timeout( &mut self, peek_timeout: Duration, ) -> &mut SniRouter<S, F>
Set an optional timeout on the ClientHello peek.
Defaults to None (no timeout). A valid-but-partial ClientHello from
an idle peer otherwise blocks until EOF; set a timeout for untrusted
ingress. Use SniRouter::with_peek_timeout_policy to choose whether
an inconclusive timeout invokes the fallback or rejects the connection.
pub fn without_peek_timeout(self) -> SniRouter<S, F>
pub fn without_peek_timeout(self) -> SniRouter<S, F>
Set an optional timeout on the ClientHello peek.
Defaults to None (no timeout). A valid-but-partial ClientHello from
an idle peer otherwise blocks until EOF; set a timeout for untrusted
ingress. Use SniRouter::with_peek_timeout_policy to choose whether
an inconclusive timeout invokes the fallback or rejects the connection.
pub fn unset_peek_timeout(&mut self) -> &mut SniRouter<S, F>
pub fn unset_peek_timeout(&mut self) -> &mut SniRouter<S, F>
Set an optional timeout on the ClientHello peek.
Defaults to None (no timeout). A valid-but-partial ClientHello from
an idle peer otherwise blocks until EOF; set a timeout for untrusted
ingress. Use SniRouter::with_peek_timeout_policy to choose whether
an inconclusive timeout invokes the fallback or rejects the connection.
pub fn with_peek_timeout_policy(
self,
peek_timeout_policy: PeekTimeoutPolicy,
) -> SniRouter<S, F>
pub fn with_peek_timeout_policy( self, peek_timeout_policy: PeekTimeoutPolicy, ) -> SniRouter<S, F>
Set how an inconclusive ClientHello peek timeout is handled.
Defaults to PeekTimeoutPolicy::FailOpen. A definitive non-TLS or
malformed ClientHello prefix invokes the fallback under either policy.
pub fn set_peek_timeout_policy(
&mut self,
peek_timeout_policy: PeekTimeoutPolicy,
) -> &mut SniRouter<S, F>
pub fn set_peek_timeout_policy( &mut self, peek_timeout_policy: PeekTimeoutPolicy, ) -> &mut SniRouter<S, F>
Set how an inconclusive ClientHello peek timeout is handled.
Defaults to PeekTimeoutPolicy::FailOpen. A definitive non-TLS or
malformed ClientHello prefix invokes the fallback under either policy.
Trait Implementations§
§impl<Stream, Output, S, F> Service<Stream> for SniRouter<S, F>where
Stream: Io + Unpin,
Output: Send + 'static,
S: Service<SniRequest<Stream>, Output = Output>,
<S as Service<SniRequest<Stream>>>::Error: Into<Box<dyn Error + Send + Sync>>,
F: Service<PrefixedIo<HeapReader, Stream>, Output = Output>,
<F as Service<PrefixedIo<HeapReader, Stream>>>::Error: Into<Box<dyn Error + Send + Sync>>,
impl<Stream, Output, S, F> Service<Stream> for SniRouter<S, F>where
Stream: Io + Unpin,
Output: Send + 'static,
S: Service<SniRequest<Stream>, Output = Output>,
<S as Service<SniRequest<Stream>>>::Error: Into<Box<dyn Error + Send + Sync>>,
F: Service<PrefixedIo<HeapReader, Stream>, Output = Output>,
<F as Service<PrefixedIo<HeapReader, Stream>>>::Error: Into<Box<dyn Error + Send + Sync>>,
Auto Trait Implementations§
impl<S, F> Freeze for SniRouter<S, F>
impl<S, F> RefUnwindSafe for SniRouter<S, F>where
S: RefUnwindSafe,
F: RefUnwindSafe,
impl<S, F> Send for SniRouter<S, F>
impl<S, F> Sync for SniRouter<S, F>
impl<S, F> Unpin for SniRouter<S, F>
impl<S, F> UnsafeUnpin for SniRouter<S, F>where
S: UnsafeUnpin,
F: UnsafeUnpin,
impl<S, F> UnwindSafe for SniRouter<S, F>where
S: UnwindSafe,
F: UnwindSafe,
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<S, Input, Connection> ConnectorService<Input> for Swhere
S: Service<Input, Output = EstablishedClientConnection<Connection, Input>>,
<S as Service<Input>>::Error: Into<ConnectionError>,
Connection: Send + ExtensionsRef,
impl<S, Input, Connection> ConnectorService<Input> for Swhere
S: Service<Input, Output = EstablishedClientConnection<Connection, Input>>,
<S as Service<Input>>::Error: Into<ConnectionError>,
Connection: Send + ExtensionsRef,
§type Connection = Connection
type Connection = Connection
ConnectorService§fn connect(
&self,
input: Input,
) -> impl Future<Output = Result<EstablishedClientConnection<<S as ConnectorService<Input>>::Connection, Input>, ConnectionError>> + Send
fn connect( &self, input: Input, ) -> impl Future<Output = Result<EstablishedClientConnection<<S as ConnectorService<Input>>::Connection, Input>, ConnectionError>> + Send
§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