Skip to main content

Reversed

Struct Reversed 

pub struct Reversed<T>(/* private fields */);
Available on crate features http-backend and http and std only.
Expand description

Run HTTP/3 in the opposite role of the QUIC connection it wraps: the QUIC client serves HTTP/3 and the QUIC server sends the requests, e.g. for a device behind NAT that dials out.

The stream IDs h3 sees have their initiator flipped, also the IDs inside GOAWAY and PRIORITY_UPDATE and in h3 qlog events. So both ends must wrap their connection. draft-thomson-ptth-potato is prior art that keeps the real IDs instead, but is not implemented in Rama since this is still an early draft.

Implementations§

§

impl<T> Reversed<T>

pub fn new(inner: T) -> Reversed<T>

pub fn get_ref(&self) -> &T

pub fn into_inner(self) -> T

§

impl Reversed<()>

pub fn application_protocol() -> ApplicationProtocol

The ALPN of reversed HTTP/3. Not potato’s token: the stream IDs differ.

Trait Implementations§

§

impl<R> BiReservation for Reversed<R>
where R: BiReservation,

§

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

§

fn clone(&self) -> Reversed<T>

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<C> Connection for Reversed<C>
where C: Connection,

§

type SendStream = Reversed<<C as Connection>::SendStream>

§

type RecvStream = Reversed<<C as Connection>::RecvStream>

§

type CloseLease = <C as Connection>::CloseLease

§

async fn open_bi( &self, ) -> Result<(<Reversed<C> as Connection>::SendStream, <Reversed<C> as Connection>::RecvStream), ConnectionError>

§

async fn open_uni( &self, ) -> Result<<Reversed<C> as Connection>::SendStream, ConnectionError>

§

async fn accept_bi( &self, ) -> Result<(<Reversed<C> as Connection>::SendStream, <Reversed<C> as Connection>::RecvStream), ConnectionError>

Accept the next peer-initiated bidirectional stream. Queued incoming streams remain available after connection closure, before the terminal error.
§

async fn accept_uni( &self, ) -> Result<<Reversed<C> as Connection>::RecvStream, ConnectionError>

Accept the next peer-initiated unidirectional stream. Queued incoming streams remain available after connection closure, before the terminal error, so HTTP/3 can drain buffered control and QPACK data.
§

fn side(&self) -> Side

Which stream IDs are locally initiated. Must match the IDs the streams report.
§

fn handshake_confirmed( &self, ) -> impl Future<Output = Result<(), ConnectionError>> + Send

Application data can be sent without 0-RTT replay risk. Before resolving successfully, publish the negotiated Config::application_protocol in NegotiatedTlsParameters in the shared extensions.
§

fn is_handshake_confirmed(&self) -> bool

Whether Self::handshake_confirmed resolved successfully; stays true after closing.
§

fn close(&self, error_code: VarInt, reason: &[u8])

§

fn closed(&self) -> impl Future<Output = ConnectionError> + Send

§

fn close_reason(&self) -> Option<ConnectionError>

§

fn available_streams(&self, dir: Dir) -> u64

Locally initiated streams that can be opened now.
§

fn max_concurrent_streams(&self, dir: Dir) -> u64

Streams this endpoint allows the peer to have open at once.
§

fn remote_stream_limit(&self, dir: Dir) -> u64

Cumulative count of streams this endpoint allows the peer to open.
§

fn local_stream_limit(&self, dir: Dir) -> u64

Cumulative count of streams the peer allows this endpoint to open.
§

fn early_data(&self) -> EarlyData

Where this client’s early data stands.
§

fn qlog_control(&self) -> Option<ConnectionQlogControl>

The qlog sink HTTP/3 events are written to.
§

fn read_datagram( &self, ) -> impl Future<Output = Result<Bytes, ConnectionError>> + Send

Receive the next QUIC DATAGRAM payload. Dropping a pending future must not discard a datagram; HTTP/3 selects this future alongside other connection work.
§

fn max_datagram_size(&self) -> Option<usize>

§

fn datagram_receive_enabled(&self) -> bool

The peer may send QUIC DATAGRAM frames to this endpoint.
§

fn received_datagrams(&self) -> usize

Datagrams received and not yet taken by Self::read_datagram.
§

fn datagram_send_ready( &self, ) -> impl Future<Output = ()> + Send + 'static + use<C>

Room on the datagram send queue, or the connection closed. Registered when called: create it before a send that may be refused as blocked and await it after the refusal.
§

fn close_lease(&self) -> <C as Connection>::CloseLease

Holds off this connection’s close at a graceful shutdown until dropped, so a tunnel can still send what it carries.
§

fn rtt(&self) -> Duration

Bounds how long a datagram waits for its request stream.
§

impl<T> Debug for Reversed<T>
where T: Debug,

§

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

Formats the value using the given formatter. Read more
§

impl<C> ExtensionsRef for Reversed<C>
where C: ExtensionsRef,

§

fn extensions(&self) -> &Extensions

Get reference to the underlying Extensions store
§

impl<R> RecvStream for Reversed<R>
where R: RecvStream,

§

fn id(&self) -> StreamId

§

fn poll_read_chunk( &mut self, cx: &mut Context<'_>, max_length: usize, ) -> Poll<Result<Option<Bytes>, ReadError>>

Read the next in-order chunk of at most max_length bytes; None at the end of the stream. Deliver already received, contiguous bytes before reporting connection loss, including after a clean connection close, so HTTP/3 can drain buffered control and QPACK data. Returning Pending must not consume bytes and must arrange to wake cx when data or a terminal result becomes available.
§

fn stop(&mut self, error_code: VarInt) -> Result<(), ClosedStream>

Stop this RecvStream with error_code
§

fn is_0rtt(&self) -> bool

Opened during 0-RTT, so its data may be replayed.
§

fn boxed(self) -> Box<dyn RecvStream>
where Self: Sized,

Erase the stream’s type, without boxing an already boxed stream.
§

impl<C> ReserveBiStreams for Reversed<C>

§

type Reservation = Reversed<<C as ReserveBiStreams>::Reservation>

§

fn try_reserve_bi( &self, ) -> Result<Option<<Reversed<C> as ReserveBiStreams>::Reservation>, ConnectionError>

None before the handshake completes or while credit is exhausted.
§

fn subscribe_bi_stream_budget(&self, listener: Weak<dyn ChangeListener>)

Notify listener when locally initiated bidirectional stream credit becomes available, the handshake completes, or the connection closes, until the listener is dropped. Acquiring or consuming a reservation need not notify listeners. Subscribe before trying to reserve credit to avoid missing a notification.
§

impl<S> SendStream for Reversed<S>
where S: SendStream,

§

type Handle = <S as SendStream>::Handle

§

fn id(&self) -> StreamId

§

fn poll_write_chunks( &mut self, cx: &mut Context<'_>, chunks: &mut [Bytes], reserve: u64, ) -> Poll<Result<(), WriteError>>

Write a prefix of chunks, consuming what was written. All accepted bytes must be removed from chunks, including partial chunks, on every poll. When returning Pending, arrange to wake cx when writing can make progress. Read more
§

fn try_write_generated( &mut self, reserve: u64, generate: impl FnOnce(usize) -> Bytes, ) -> Result<(), WriteError>

Write the chunk generate builds for the credit available now (minus reserve, 0 if unknown), calling it exactly once and atomically: QPACK commits encoder state inside it.
§

fn finish(&mut self) -> Result<(), ClosedStream>

Finish this SendStream
§

fn reset(&mut self, error_code: VarInt) -> Result<(), ClosedStream>

Reset this SendStream with the given error_code
§

fn set_priority(&self, priority: i32) -> Result<(), ClosedStream>

Set priority of this stream
§

fn stopped( &self, ) -> impl Future<Output = Result<Option<VarInt>, StoppedError>> + Send + Sync + 'static + use<S>

Resolves with the peer’s STOP_SENDING code, or None once all data is acknowledged.
§

fn handle(&self) -> <Reversed<S> as SendStream>::Handle

§

fn boxed_handle(&self) -> Arc<dyn StreamHandle> ⓘ

Erase the stream handle’s type, reusing an existing shared handle when available.

Auto Trait Implementations§

§

impl<T> Freeze for Reversed<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for Reversed<T>
where T: RefUnwindSafe,

§

impl<T> Send for Reversed<T>
where T: Send,

§

impl<T> Sync for Reversed<T>
where T: Sync,

§

impl<T> Unpin for Reversed<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for Reversed<T>
where T: UnsafeUnpin,

§

impl<T> UnwindSafe for Reversed<T>
where T: UnwindSafe,

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
§

impl<T> ForwardedClientExt for T
where T: ExtensionsRef + ?Sized,

§

fn forwarded_client(&self) -> Option<&ForwardedElement>

The element describing the client.
§

fn forwarded_client_ip(&self) -> Option<IpAddr>

The client’s IP, from its for node.
§

fn forwarded_client_socket_addr(&self) -> Option<SocketAddress>

The client’s IP and port, from its for node.
§

fn forwarded_client_host(&self) -> Option<&ForwardedAuthority>

The host the client asked for.
§

fn forwarded_client_proto(&self) -> Option<ForwardedProtocol>

The protocol the client used.
§

fn forwarded_client_version(&self) -> Option<ForwardedVersion>

The HTTP version the client used.
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