Skip to main content

Serve

Struct Serve 

Source
pub struct Serve<L, M, S, B> { /* private fields */ }
Expand description

A server future that serves HTTP connections.

This is the return type of serve. It implements IntoFuture, so you can directly .await it:

ⓘ
serve(listener, service).await?;

Before awaiting, you can configure it:

Created by serve.

Implementations§

Source§

impl<L, M, S, B> Serve<L, M, S, B>
where L: Listener,

Source

pub fn configure_hyper<F>(self, f: F) -> Self
where F: FnOnce(Builder<TokioExecutor>) -> Builder<TokioExecutor>,

Configure the underlying Hyper connection builder.

This allows you to customize Hyper’s HTTP/1 and HTTP/2 settings, such as timeouts, max concurrent streams, keep-alive behavior, etc.

Note: Calling this replaces the default builder entirely, opting out of the built-in HTTP/2 defaults. You are responsible for setting your own HTTP/2 timeouts. The connection limit and Self::header_read_timeout remain enabled. When HTTP/1 is enabled, serve supplies its timer and applies header_read_timeout after this configuration, overriding any HTTP/1 header-read timeout set on the builder.

http1_only() and http2_only() restrict the accepted protocol and use Hyper’s regular connection API without HTTP/1 upgrades. When both protocols are enabled, serve uses serve_connection_with_upgrades. For HTTP/1-only upgrades, use a custom serve loop.

The configuration callback runs once when this method is called. The configured builder is shared across connections.

§Example
ⓘ
use std::time::Duration;

serve(listener, service)
    .configure_hyper(|mut builder| {
        builder.http1().keep_alive(true);
        builder.http2().max_concurrent_streams(200);
        builder
    })
    .await?;
§Advanced: Per-Connection Configuration

If you need per-connection customization (e.g., different settings based on the remote address), you can implement your own connection loop. See the module-level documentation for examples.

Source

pub fn max_connections(self, max: usize) -> Self

Set the maximum number of concurrently accepted connections.

The default limit is 16,384. Once the limit is reached, serve stops accepting connections until an existing connection closes.

Passing 0 disables the limit, equivalent to disable_connection_limit. Values above [tokio::sync::Semaphore::MAX_PERMITS] are clamped to that value.

Source

pub fn disable_connection_limit(self) -> Self

Disable the default accepted-connection limit.

Source

pub fn header_read_timeout(self, timeout: Option<Duration>) -> Self

Set the timeout for receiving a complete request head.

The default is one minute. The first-request deadline starts when the connection task begins driving Hyper, after make_service finishes. It includes protocol negotiation and header parsing and does not reset as bytes arrive. It ends before Tower readiness, middleware, or body reads.

The same setting configures Hyper’s HTTP/1 header-read timeout for later requests. Per-request header-read timeout protection is currently supported only for HTTP/1. HTTP/2 is covered only until the first request head arrives; later HTTP/2 streams have no header-read deadline. This deadline does not limit body reads or time spent waiting for server events. This setting takes precedence over the HTTP/1 header-read timeout supplied through Self::configure_hyper. Pass None or Some(Duration::ZERO) to disable both deadlines.

Source

pub fn with_graceful_shutdown<F>( self, signal: F, ) -> ServeWithGracefulShutdown<L, M, S, F, B>
where F: Future<Output = ()> + Send + 'static,

Enable graceful shutdown for the server.

Source

pub fn local_addr(&self) -> Result<L::Addr>

Returns the local address this server is bound to.

Trait Implementations§

Source§

impl<L, M, S, B> Debug for Serve<L, M, S, B>
where L: Debug,

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<L, M, S, B> IntoFuture for Serve<L, M, S, B>
where L: Listener, L::Addr: Debug, B: HttpBody + Send + 'static, B::Data: Send, B::Error: Into<Box<dyn StdError + Send + Sync>>, S: Service<Request<Incoming>, Response = Response<B>, Error = Infallible> + Clone + Send + 'static, S::Future: Send, M: for<'a> Service<IncomingStream<'a, L>, Error = Infallible, Response = S> + Send + 'static, for<'a> <M as Service<IncomingStream<'a, L>>>::Future: Send,

Source§

type Output = Result<(), Error>

The output that the future will produce on completion.
Source§

type IntoFuture = Pin<Box<dyn Future<Output = Result<(), Error>> + Send>>

Which kind of future are we turning this into?
Source§

fn into_future(self) -> Self::IntoFuture

Creates a future from a value. Read more

Auto Trait Implementations§

§

impl<L, M, S, B> Freeze for Serve<L, M, S, B>
where L: Freeze, M: Freeze,

§

impl<L, M, S, B> !RefUnwindSafe for Serve<L, M, S, B>

§

impl<L, M, S, B> Send for Serve<L, M, S, B>
where L: Send, M: Send, S: Send, B: Send,

§

impl<L, M, S, B> Sync for Serve<L, M, S, B>
where L: Sync, M: Sync, S: Sync, B: Sync,

§

impl<L, M, S, B> Unpin for Serve<L, M, S, B>
where L: Unpin, M: Unpin, S: Unpin, B: Unpin,

§

impl<L, M, S, B> UnsafeUnpin for Serve<L, M, S, B>
where L: UnsafeUnpin, M: UnsafeUnpin,

§

impl<L, M, S, B> !UnwindSafe for Serve<L, M, S, B>

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.

§

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<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

§

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

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
§

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,

§

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