Skip to main content

Http3MitmRelay

Struct Http3MitmRelay 

pub struct Http3MitmRelay<M = (ConsumeErrLayer<Trace, StaticOutput<DefaultErrorResponse>>, ArcLayer), P = bool> { /* private fields */ }
Available on crate feature http-backend only.
Expand description

Relays HTTP/3 between a server connection (ingress) and a client connection (egress) that were established and authenticated before: the HTTP/3 counterpart of HttpMitmRelay.

Requests pass through the same HTTP middleware model: hop-by-hop fields are consumed at the boundary and Self::with_bound_authority checks every request before and after the middleware. Each hop keeps its own QPACK state; egress SETTINGS arrive before the ingress side advertises its own, so Extended CONNECT is offered only when the origin supports it, and ingress field sections are bounded by the origin’s limit. Priorities follow each request upstream, CONNECT and Extended CONNECT tunnels are bridged until both directions finish, and middleware selects Capsule/HTTP Datagram semantics with HttpDatagrams. GOAWAY from either side drains the relay.

Each hop advertises the other peer’s initial SETTINGS in their original order, limited to what this relay implements plus GREASE: values are lowered to the local hop’s budgets, an origin’s Extended CONNECT grant is dropped unless ingress offers it, and HTTP Datagram grants unless both hops carry datagrams; a client’s ENABLE_CONNECT_PROTOCOL grants nothing and is kept. Other settings are dropped and traced. SETTINGS missing the readiness deadline leave the other hop on its own. An explicit Config::settings_profile on a hop is used as configured instead.

Early requests and server push are disabled on both hops. A relay that fails, or whose serve future is dropped (even before it is first polled), closes both connections with H3_INTERNAL_ERROR.

Implementations§

§

impl Http3MitmRelay

pub fn new(exec: Executor) -> Http3MitmRelay

Create a relay with default per-hop configurations; ingress offers Extended CONNECT whenever the origin does.

§

impl<M, P> Http3MitmRelay<M, P>

pub fn with_bound_authority<Q>( self, authority: BoundAuthority<Q>, ) -> Http3MitmRelay<M, Q>

Bind the relayed connection to its trusted logical origin and policy.

Mismatches return 421 without opening an upstream request stream.

pub fn with_http_middleware<N>(self, middleware: N) -> Http3MitmRelay<N, P>

Set the HTTP middleware between the ingress server and the egress client.

pub fn with_ingress_config(self, config: Config) -> Http3MitmRelay<M, P>

HTTP/3 settings of the ingress (server) side.

pub fn set_ingress_config( &mut self, config: Config, ) -> &mut Http3MitmRelay<M, P>

HTTP/3 settings of the ingress (server) side.

pub fn with_egress_config(self, config: Config) -> Http3MitmRelay<M, P>

HTTP/3 settings of the egress (client) side.

pub fn set_egress_config(&mut self, config: Config) -> &mut Http3MitmRelay<M, P>

HTTP/3 settings of the egress (client) side.

pub fn with_settings_timeout(self, timeout: Duration) -> Http3MitmRelay<M, P>

How long both QUIC handshakes, optional client SETTINGS readiness and the origin’s SETTINGS may take, counted from the moment serve is called. Defaults to DEFAULT_EAGER_PEER_SETTINGS_TIMEOUT.

pub fn set_settings_timeout( &mut self, timeout: Duration, ) -> &mut Http3MitmRelay<M, P>

How long both QUIC handshakes, optional client SETTINGS readiness and the origin’s SETTINGS may take, counted from the moment serve is called. Defaults to DEFAULT_EAGER_PEER_SETTINGS_TIMEOUT.

pub fn with_forbidden_trailers( self, forbidden_trailers: ForbiddenTrailers, ) -> Http3MitmRelay<M, P>

Which trailer fields are forwarded although their definitions forbid them in trailers. Defaults to ForbiddenTrailers::AllowAll.

pub fn set_forbidden_trailers( &mut self, forbidden_trailers: ForbiddenTrailers, ) -> &mut Http3MitmRelay<M, P>

Which trailer fields are forwarded although their definitions forbid them in trailers. Defaults to ForbiddenTrailers::AllowAll.

Trait Implementations§

§

impl<M, P> Clone for Http3MitmRelay<M, P>
where M: Clone, P: Clone,

§

fn clone(&self) -> Http3MitmRelay<M, P>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<M, P> Debug for Http3MitmRelay<M, P>
where M: Debug, P: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<M, P> Service<BridgeIo<Connection, Connection>> for Http3MitmRelay<M, P>

§

type Output = ()

The type of the output returned by the service.
§

type Error = Box<dyn Error + Sync + Send>

The type of error returned by the service.
§

fn serve( &self, _: BridgeIo<Connection, Connection>, ) -> impl Future<Output = Result<(), Box<dyn Error + Sync + Send>>> + Send

Serve an output or an error for the given input
§

fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>

Box this service to allow for dynamic dispatch.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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

§

fn into_request(self) -> Request<T>

Wrap the input message T in a rama_grpc::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
§

impl<T, U> RamaFrom<T> for U
where U: From<T>,

§

fn rama_from(value: T) -> U

§

impl<T, U, CrateMarker> RamaInto<U, CrateMarker> for T
where U: RamaFrom<T, CrateMarker>,

§

fn rama_into(self) -> U

§

impl<T, U> RamaTryFrom<T> for U
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

§

fn rama_try_from(value: T) -> Result<U, <U as RamaTryFrom<T>>::Error>

§

impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for T
where U: RamaTryFrom<T, CrateMarker>,

§

type Error = <U as RamaTryFrom<T, CrateMarker>>::Error

§

fn rama_try_into(self) -> Result<U, <U as RamaTryFrom<T, CrateMarker>>::Error>

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<V, F> ValueFormatter<&V> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &&V)

Write value to writer
§

impl<V, F> ValueFormatter<Arc<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Arc<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Box<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Box<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Cow<'_, V>> for F
where V: ToOwned + ?Sized, F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Cow<'_, V>)

Write value to writer
§

impl<V, F> ValueFormatter<Option<V>> for F
where F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Option<V>)

Write value to writer
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more