Struct HttpMitmRelay
pub struct HttpMitmRelay<M = (ConsumeErrLayer<Trace, StaticOutput<DefaultErrorResponse>>, ArcLayer)> { /* private fields */ }http-backend only.Expand description
A utility that can be used by MITM services such as transparent proxies, in order to relay HTTP requests and responses between a client and server, as part of a deep protocol inspection protocol (DPI) flow.
Useful if you have a fairly standard MITM http flow and already have pre-established ingress and egress connections (e.g. because you already MITM’d the <L7 layers, such as SOCKS5 MITM’ng, TLS, …).
HTTP/1 responses originally delimited by EOF (without Content-Length or Transfer-Encoding) retain that framing downstream, including HTTP/1.1. They stream without chunking and close the downstream connection at body EOF. Preserving EOF framing sacrifices downstream connection reuse and explicit truncation detection. Middleware can select different framing by adding Content-Length or Transfer-Encoding; a Trailer header also prevents automatic EOF framing. HTTP/2 framing is unaffected.
When an HTTP/2 egress connection ends (EOF, GOAWAY, error), the
ingress connection is shut down gracefully with a GOAWAY, so idle
clients reconnect instead of sending into a dead relay. Ingress
requests the egress provably never processed (over all attempts
middleware made for them) are reset with REFUSED_STREAM, which
clients may safely retry: they raced that close (never sent, or not
covered by the egress GOAWAY), or the egress refused their stream.
This replaces any response middleware made for such a request, e.g.
the default 502.
The relay does not consume proxy-authentication fields: a transparent
intermediary may be forwarding them to the proxy that owns the exchange.
A proxy that owns that exchange should explicitly apply the proxy_auth
request and response removal layers in its middleware.
Implementations§
§impl HttpMitmRelay
impl HttpMitmRelay
pub fn new(exec: Executor) -> HttpMitmRelay
pub fn new(exec: Executor) -> HttpMitmRelay
Create a new HttpMitmRelay, ready to serve.
pub fn with_http_middleware<M>(self, middleware: M) -> HttpMitmRelay<M>
pub fn with_http_middleware<M>(self, middleware: M) -> HttpMitmRelay<M>
Set HTTP middleware to use between server and client.
Context-aware hop-by-hop sanitation remains at the relay boundary. Fields received from each connection are consumed before this middleware handles the message. Transport intent added by the middleware is therefore originated for the next connection.
§impl<M> HttpMitmRelay<M>
impl<M> HttpMitmRelay<M>
pub fn with_eager_peer_settings_timeout(
self,
timeout: Duration,
) -> HttpMitmRelay<M>
pub fn with_eager_peer_settings_timeout( self, timeout: Duration, ) -> HttpMitmRelay<M>
Hard cap on how long the eager phase-2 init waits for the
upstream’s initial h2 SETTINGS frame before giving up and
proceeding without mirroring. Defaults to
DEFAULT_EAGER_PEER_SETTINGS_TIMEOUT. Only applies when
the egress IO carries TargetHttpVersion(HTTP_2).
pub fn set_eager_peer_settings_timeout(
&mut self,
timeout: Duration,
) -> &mut HttpMitmRelay<M>
pub fn set_eager_peer_settings_timeout( &mut self, timeout: Duration, ) -> &mut HttpMitmRelay<M>
Hard cap on how long the eager phase-2 init waits for the
upstream’s initial h2 SETTINGS frame before giving up and
proceeding without mirroring. Defaults to
DEFAULT_EAGER_PEER_SETTINGS_TIMEOUT. Only applies when
the egress IO carries TargetHttpVersion(HTTP_2).
pub fn with_forbidden_trailers(
self,
forbidden_trailers: ForbiddenTrailers,
) -> HttpMitmRelay<M>
pub fn with_forbidden_trailers( self, forbidden_trailers: ForbiddenTrailers, ) -> HttpMitmRelay<M>
Which trailer fields the relay forwards although their definitions do not allow
them in trailers. Defaults to ForbiddenTrailers::AllowAll: a relay forwards
trailers as received, except fields that frame or route the message.
pub fn set_forbidden_trailers(
&mut self,
forbidden_trailers: ForbiddenTrailers,
) -> &mut HttpMitmRelay<M>
pub fn set_forbidden_trailers( &mut self, forbidden_trailers: ForbiddenTrailers, ) -> &mut HttpMitmRelay<M>
Which trailer fields the relay forwards although their definitions do not allow
them in trailers. Defaults to ForbiddenTrailers::AllowAll: a relay forwards
trailers as received, except fields that frame or route the message.
Trait Implementations§
§impl<M> Clone for HttpMitmRelay<M>where
M: Clone,
impl<M> Clone for HttpMitmRelay<M>where
M: Clone,
§fn clone(&self) -> HttpMitmRelay<M>
fn clone(&self) -> HttpMitmRelay<M>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl<M> Debug for HttpMitmRelay<M>where
M: Debug,
impl<M> Debug for HttpMitmRelay<M>where
M: Debug,
§impl<Ingress, Egress, M> Service<BridgeIo<Ingress, Egress>> for HttpMitmRelay<M>where
Ingress: Io + Unpin + ExtensionsRef,
Egress: Io + Unpin + ExtensionsRef,
(RemoveRequestHeaderLayer, M, RemoveResponseHeaderLayer): Layer<HttpClientService<Body>> + Clone,
<(RemoveRequestHeaderLayer, M, RemoveResponseHeaderLayer) as Layer<HttpClientService<Body>>>::Service: Service<Request, Output = Response> + Clone,
<<(RemoveRequestHeaderLayer, M, RemoveResponseHeaderLayer) as Layer<HttpClientService<Body>>>::Service as Service<Request>>::Error: Into<Box<dyn Error + Sync + Send>>,
M: Send + Sync + 'static + Clone,
impl<Ingress, Egress, M> Service<BridgeIo<Ingress, Egress>> for HttpMitmRelay<M>where
Ingress: Io + Unpin + ExtensionsRef,
Egress: Io + Unpin + ExtensionsRef,
(RemoveRequestHeaderLayer, M, RemoveResponseHeaderLayer): Layer<HttpClientService<Body>> + Clone,
<(RemoveRequestHeaderLayer, M, RemoveResponseHeaderLayer) as Layer<HttpClientService<Body>>>::Service: Service<Request, Output = Response> + Clone,
<<(RemoveRequestHeaderLayer, M, RemoveResponseHeaderLayer) as Layer<HttpClientService<Body>>>::Service as Service<Request>>::Error: Into<Box<dyn Error + Sync + Send>>,
M: Send + Sync + 'static + Clone,
§async fn serve(
&self,
__arg1: BridgeIo<Ingress, Egress>,
) -> Result<<HttpMitmRelay<M> as Service<BridgeIo<Ingress, Egress>>>::Output, <HttpMitmRelay<M> as Service<BridgeIo<Ingress, Egress>>>::Error>
async fn serve( &self, __arg1: BridgeIo<Ingress, Egress>, ) -> Result<<HttpMitmRelay<M> as Service<BridgeIo<Ingress, Egress>>>::Output, <HttpMitmRelay<M> as Service<BridgeIo<Ingress, Egress>>>::Error>
§fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
Auto Trait Implementations§
impl<M> Freeze for HttpMitmRelay<M>where
M: Freeze,
impl<M> RefUnwindSafe for HttpMitmRelay<M>where
M: RefUnwindSafe,
impl<M> Send for HttpMitmRelay<M>where
M: Send,
impl<M> Sync for HttpMitmRelay<M>where
M: Sync,
impl<M> Unpin for HttpMitmRelay<M>where
M: Unpin,
impl<M> UnsafeUnpin for HttpMitmRelay<M>where
M: UnsafeUnpin,
impl<M> UnwindSafe for HttpMitmRelay<M>where
M: 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<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