Struct PeekTlsClientHelloService
pub struct PeekTlsClientHelloService<S, F = RejectService<(), NoTlsRejectError>> { /* private fields */ }tls only.Expand description
A peek Service which returns the ClientHello to the inner
service for tls-detected traffic, and otherwise make use of the Reject service.
The difference with SniRouter is that the entire
ClientHello is parsed and returned instead of just the SNI. Use the router
in case all you care about is the SNI, given it is more efficient.
By default non-tls traffic is rejected using RejectService.
Use PeekTlsClientHelloService::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
PeekTlsClientHelloService::with_peek_timeout_policy.
Use the standalone peek_client_hello_from_input function if you prefer
this is as a standalone function instead.
Implementations§
§impl<S> PeekTlsClientHelloService<S>
impl<S> PeekTlsClientHelloService<S>
pub fn new(service: S) -> PeekTlsClientHelloService<S>
pub fn new(service: S) -> PeekTlsClientHelloService<S>
Create a new PeekTlsClientHelloService.
pub fn with_fallback<F>(self, fallback: F) -> PeekTlsClientHelloService<S, F>
pub fn with_fallback<F>(self, fallback: F) -> PeekTlsClientHelloService<S, F>
Attach a fallback Service to this PeekTlsClientHelloService.
Used in case the traffic is not Tls traffic (defined by the first bytes).
§impl<S, F> PeekTlsClientHelloService<S, F>
impl<S, F> PeekTlsClientHelloService<S, F>
pub fn maybe_with_peek_timeout(
self,
peek_timeout: Option<Duration>,
) -> PeekTlsClientHelloService<S, F>
pub fn maybe_with_peek_timeout( self, peek_timeout: Option<Duration>, ) -> PeekTlsClientHelloService<S, F>
Set the maximum time spent peeking for a TLS ClientHello.
A timeout is inconclusive. Use
PeekTlsClientHelloService::with_peek_timeout_policy to choose
whether it invokes the fallback or rejects the connection.
pub fn maybe_set_peek_timeout(
&mut self,
peek_timeout: Option<Duration>,
) -> &mut PeekTlsClientHelloService<S, F>
pub fn maybe_set_peek_timeout( &mut self, peek_timeout: Option<Duration>, ) -> &mut PeekTlsClientHelloService<S, F>
Set the maximum time spent peeking for a TLS ClientHello.
A timeout is inconclusive. Use
PeekTlsClientHelloService::with_peek_timeout_policy to choose
whether it invokes the fallback or rejects the connection.
pub fn with_peek_timeout(
self,
peek_timeout: Duration,
) -> PeekTlsClientHelloService<S, F>
pub fn with_peek_timeout( self, peek_timeout: Duration, ) -> PeekTlsClientHelloService<S, F>
Set the maximum time spent peeking for a TLS ClientHello.
A timeout is inconclusive. Use
PeekTlsClientHelloService::with_peek_timeout_policy to choose
whether it invokes the fallback or rejects the connection.
pub fn set_peek_timeout(
&mut self,
peek_timeout: Duration,
) -> &mut PeekTlsClientHelloService<S, F>
pub fn set_peek_timeout( &mut self, peek_timeout: Duration, ) -> &mut PeekTlsClientHelloService<S, F>
Set the maximum time spent peeking for a TLS ClientHello.
A timeout is inconclusive. Use
PeekTlsClientHelloService::with_peek_timeout_policy to choose
whether it invokes the fallback or rejects the connection.
pub fn without_peek_timeout(self) -> PeekTlsClientHelloService<S, F>
pub fn without_peek_timeout(self) -> PeekTlsClientHelloService<S, F>
Set the maximum time spent peeking for a TLS ClientHello.
A timeout is inconclusive. Use
PeekTlsClientHelloService::with_peek_timeout_policy to choose
whether it invokes the fallback or rejects the connection.
pub fn unset_peek_timeout(&mut self) -> &mut PeekTlsClientHelloService<S, F>
pub fn unset_peek_timeout(&mut self) -> &mut PeekTlsClientHelloService<S, F>
Set the maximum time spent peeking for a TLS ClientHello.
A timeout is inconclusive. Use
PeekTlsClientHelloService::with_peek_timeout_policy to choose
whether it invokes the fallback or rejects the connection.
pub fn with_peek_timeout_policy(
self,
peek_timeout_policy: PeekTimeoutPolicy,
) -> PeekTlsClientHelloService<S, F>
pub fn with_peek_timeout_policy( self, peek_timeout_policy: PeekTimeoutPolicy, ) -> PeekTlsClientHelloService<S, F>
Set how an inconclusive 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 PeekTlsClientHelloService<S, F>
pub fn set_peek_timeout_policy( &mut self, peek_timeout_policy: PeekTimeoutPolicy, ) -> &mut PeekTlsClientHelloService<S, F>
Set how an inconclusive 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<S, F> Clone for PeekTlsClientHelloService<S, F>
impl<S, F> Clone for PeekTlsClientHelloService<S, F>
§fn clone(&self) -> PeekTlsClientHelloService<S, F>
fn clone(&self) -> PeekTlsClientHelloService<S, F>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl<S, F> Debug for PeekTlsClientHelloService<S, F>
impl<S, F> Debug for PeekTlsClientHelloService<S, F>
§impl<PeekableInput, Output, S, F> Service<PeekableInput> for PeekTlsClientHelloService<S, F>where
PeekableInput: PeekIoProvider,
<PeekableInput as PeekIoProvider>::PeekIo: Unpin,
Output: Send + 'static,
S: Service<InputWithClientHello<<PeekableInput as PeekIoProvider>::Mapped<PrefixedIo<HeapReader, <PeekableInput as PeekIoProvider>::PeekIo>>>, Output = Output>,
<S as Service<InputWithClientHello<<PeekableInput as PeekIoProvider>::Mapped<PrefixedIo<HeapReader, <PeekableInput as PeekIoProvider>::PeekIo>>>>>::Error: Into<Box<dyn Error + Send + Sync>>,
F: Service<<PeekableInput as PeekIoProvider>::Mapped<PrefixedIo<HeapReader, <PeekableInput as PeekIoProvider>::PeekIo>>, Output = Output>,
<F as Service<<PeekableInput as PeekIoProvider>::Mapped<PrefixedIo<HeapReader, <PeekableInput as PeekIoProvider>::PeekIo>>>>::Error: Into<Box<dyn Error + Send + Sync>>,
impl<PeekableInput, Output, S, F> Service<PeekableInput> for PeekTlsClientHelloService<S, F>where
PeekableInput: PeekIoProvider,
<PeekableInput as PeekIoProvider>::PeekIo: Unpin,
Output: Send + 'static,
S: Service<InputWithClientHello<<PeekableInput as PeekIoProvider>::Mapped<PrefixedIo<HeapReader, <PeekableInput as PeekIoProvider>::PeekIo>>>, Output = Output>,
<S as Service<InputWithClientHello<<PeekableInput as PeekIoProvider>::Mapped<PrefixedIo<HeapReader, <PeekableInput as PeekIoProvider>::PeekIo>>>>>::Error: Into<Box<dyn Error + Send + Sync>>,
F: Service<<PeekableInput as PeekIoProvider>::Mapped<PrefixedIo<HeapReader, <PeekableInput as PeekIoProvider>::PeekIo>>, Output = Output>,
<F as Service<<PeekableInput as PeekIoProvider>::Mapped<PrefixedIo<HeapReader, <PeekableInput as PeekIoProvider>::PeekIo>>>>::Error: Into<Box<dyn Error + Send + Sync>>,
§async fn serve(
&self,
input: PeekableInput,
) -> Result<<PeekTlsClientHelloService<S, F> as Service<PeekableInput>>::Output, <PeekTlsClientHelloService<S, F> as Service<PeekableInput>>::Error>
async fn serve( &self, input: PeekableInput, ) -> Result<<PeekTlsClientHelloService<S, F> as Service<PeekableInput>>::Output, <PeekTlsClientHelloService<S, F> as Service<PeekableInput>>::Error>
§fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
Auto Trait Implementations§
impl<S, F> Freeze for PeekTlsClientHelloService<S, F>
impl<S, F> RefUnwindSafe for PeekTlsClientHelloService<S, F>where
S: RefUnwindSafe,
F: RefUnwindSafe,
impl<S, F> Send for PeekTlsClientHelloService<S, F>
impl<S, F> Sync for PeekTlsClientHelloService<S, F>
impl<S, F> Unpin for PeekTlsClientHelloService<S, F>
impl<S, F> UnsafeUnpin for PeekTlsClientHelloService<S, F>where
S: UnsafeUnpin,
F: UnsafeUnpin,
impl<S, F> UnwindSafe for PeekTlsClientHelloService<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