Skip to main content

IncomingStream

Struct IncomingStream 

Source
pub struct IncomingStream<'a, L>
where L: Listener,
{ pub io: &'a TokioIo<L::Io>, pub remote_addr: L::Addr, }
Expand description

An incoming stream that bundles connection information.

This struct serves as the request type for the make_service Tower service, allowing it to access connection-level metadata when creating per-connection services.

§Purpose

In Tower/Hyper’s model, make_service is called once per connection to create a service that handles all HTTP requests on that connection. IncomingStream provides the connection information needed to customize service creation based on:

  • The remote address (for logging or access control)
  • The underlying IO type (for protocol detection or configuration)

§Design

This type holds a reference to the IO rather than ownership because:

  • The actual IO is still needed by Hyper to serve the connection after make_service returns
  • The make_service only needs to inspect connection metadata, not take ownership

§Lifetime Safety

The lifetime 'a ensures the reference to IO remains valid only during the make_service.call() invocation. After the service is created, the IO is moved into a spawned task to handle the connection. This is safe because:

let io = TokioIo::new(stream);           // IO created
let service = make_service.call(
    IncomingStream { io: &io, .. }       // Borrowed during call
).await;                                  // Borrow ends
tokio::spawn(serve_connection(io, ..));  // IO moved to task

The borrow checker guarantees the reference doesn’t outlive the IO object.

Used with serve and crate::routing::IntoMakeServiceWithConnectInfo.

Fields§

§io: &'a TokioIo<L::Io>

Reference to the IO for this connection

§remote_addr: L::Addr

Remote address of the client

Implementations§

Source§

impl<L> IncomingStream<'_, L>
where L: Listener,

Source

pub fn io(&self) -> &L::Io

Get a reference to the inner IO type.

Source

pub fn remote_addr(&self) -> &L::Addr

Returns the remote address that this stream is bound to.

Trait Implementations§

Source§

impl<'a, L> Connected<IncomingStream<'a, L>> for SocketAddr
where L: Listener<Addr = SocketAddr>,

Source§

fn connect_info(target: IncomingStream<'a, L>) -> Self

Create type holding information about the connection.
Source§

impl<'a, L> Debug for IncomingStream<'a, L>
where L: Listener + Debug, L::Io: Debug, L::Addr: Debug,

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, L> Freeze for IncomingStream<'a, L>
where <L as Listener>::Addr: Freeze,

§

impl<'a, L> RefUnwindSafe for IncomingStream<'a, L>

§

impl<'a, L> Send for IncomingStream<'a, L>
where <L as Listener>::Io: Sync,

§

impl<'a, L> Sync for IncomingStream<'a, L>
where <L as Listener>::Addr: Sync, <L as Listener>::Io: Sync,

§

impl<'a, L> Unpin for IncomingStream<'a, L>
where <L as Listener>::Addr: Unpin,

§

impl<'a, L> UnwindSafe for IncomingStream<'a, L>
where <L as Listener>::Addr: UnwindSafe, <L as Listener>::Io: RefUnwindSafe,

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

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
Source§

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

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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