rama::http::core::h2::server

Struct Builder

pub struct Builder { /* private fields */ }
Expand description

Builds server connections with custom configuration values.

Methods can be chained in order to set the configuration values.

The server is constructed by calling handshake and passing the I/O handle that will back the HTTP/2 server.

New instances of Builder are obtained via Builder::new.

See function level documentation for details on the various server configuration settings.

§Examples

// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .initial_window_size(1_000_000)
    .max_concurrent_streams(1000)
    .handshake(my_io);

Implementations§

§

impl Builder

pub fn new() -> Builder

Returns a new server builder instance initialized with default configuration values.

Configuration methods can be chained on the return value.

§Examples
// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .initial_window_size(1_000_000)
    .max_concurrent_streams(1000)
    .handshake(my_io);

pub fn initial_window_size(&mut self, size: u32) -> &mut Builder

Indicates the initial window size (in octets) for stream-level flow control for received data.

The initial window of a stream is used as part of flow control. For more details, see FlowControl.

The default value is 65,535.

§Examples
// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .initial_window_size(1_000_000)
    .handshake(my_io);

pub fn initial_connection_window_size(&mut self, size: u32) -> &mut Builder

Indicates the initial window size (in octets) for connection-level flow control for received data.

The initial window of a connection is used as part of flow control. For more details, see FlowControl.

The default value is 65,535.

§Examples
// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .initial_connection_window_size(1_000_000)
    .handshake(my_io);

pub fn max_frame_size(&mut self, max: u32) -> &mut Builder

Indicates the size (in octets) of the largest HTTP/2 frame payload that the configured server is able to accept.

The sender may send data frames that are smaller than this value, but any data larger than max will be broken up into multiple DATA frames.

The value must be between 16,384 and 16,777,215. The default value is 16,384.

§Examples
// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .max_frame_size(1_000_000)
    .handshake(my_io);
§Panics

This function panics if max is not within the legal range specified above.

pub fn max_header_list_size(&mut self, max: u32) -> &mut Builder

Sets the max size of received header frames.

This advisory setting informs a peer of the maximum size of header list that the sender is prepared to accept, in octets. The value is based on the uncompressed size of header fields, including the length of the name and value in octets plus an overhead of 32 octets for each header field.

This setting is also used to limit the maximum amount of data that is buffered to decode HEADERS frames.

§Examples
// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .max_header_list_size(16 * 1024)
    .handshake(my_io);

pub fn max_concurrent_streams(&mut self, max: u32) -> &mut Builder

Sets the maximum number of concurrent streams.

The maximum concurrent streams setting only controls the maximum number of streams that can be initiated by the remote peer. In other words, when this setting is set to 100, this does not limit the number of concurrent streams that can be created by the caller.

It is recommended that this value be no smaller than 100, so as to not unnecessarily limit parallelism. However, any value is legal, including 0. If max is set to 0, then the remote will not be permitted to initiate streams.

Note that streams in the reserved state, i.e., push promises that have been reserved but the stream has not started, do not count against this setting.

Also note that if the remote does exceed the value set here, it is not a protocol level error. Instead, the h2 library will immediately reset the stream.

See Section 5.1.2 in the HTTP/2 spec for more details.

§Examples
// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .max_concurrent_streams(1000)
    .handshake(my_io);

pub fn max_concurrent_reset_streams(&mut self, max: usize) -> &mut Builder

Sets the maximum number of concurrent locally reset streams.

When a stream is explicitly reset by either calling SendResponse::send_reset or by dropping a SendResponse instance before completing the stream, the HTTP/2 specification requires that any further frames received for that stream must be ignored for “some time”.

In order to satisfy the specification, internal state must be maintained to implement the behavior. This state grows linearly with the number of streams that are locally reset.

The max_concurrent_reset_streams setting configures sets an upper bound on the amount of state that is maintained. When this max value is reached, the oldest reset stream is purged from memory.

Once the stream has been fully purged from memory, any additional frames received for that stream will result in a connection level protocol error, forcing the connection to terminate.

The default value is 10.

§Examples
// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .max_concurrent_reset_streams(1000)
    .handshake(my_io);

pub fn max_local_error_reset_streams( &mut self, max: Option<usize>, ) -> &mut Builder

Sets the maximum number of local resets due to protocol errors made by the remote end.

Invalid frames and many other protocol errors will lead to resets being generated for those streams. Too many of these often indicate a malicious client, and there are attacks which can abuse this to DOS servers. This limit protects against these DOS attacks by limiting the amount of resets we can be forced to generate.

When the number of local resets exceeds this threshold, the server will issue GOAWAYs with an error code of ENHANCE_YOUR_CALM to the client.

If you really want to disable this, supply Option::None here. Disabling this is not recommended and may expose you to DOS attacks.

The default value is currently 1024, but could change.

pub fn max_pending_accept_reset_streams(&mut self, max: usize) -> &mut Builder

Sets the maximum number of pending-accept remotely-reset streams.

Streams that have been received by the peer, but not accepted by the user, can also receive a RST_STREAM. This is a legitimate pattern: one could send a request and then shortly after, realize it is not needed, sending a CANCEL.

However, since those streams are now “closed”, they don’t count towards the max concurrent streams. So, they will sit in the accept queue, using memory.

When the number of remotely-reset streams sitting in the pending-accept queue reaches this maximum value, a connection error with the code of ENHANCE_YOUR_CALM will be sent to the peer, and returned by the Future.

The default value is currently 20, but could change.

§Examples
// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .max_pending_accept_reset_streams(100)
    .handshake(my_io);

pub fn max_send_buffer_size(&mut self, max: usize) -> &mut Builder

Sets the maximum send buffer size per stream.

Once a stream has buffered up to (or over) the maximum, the stream’s flow control will not “poll” additional capacity. Once bytes for the stream have been written to the connection, the send buffer capacity will be freed up again.

The default is currently ~400KB, but may change.

§Panics

This function panics if max is larger than u32::MAX.

pub fn reset_stream_duration(&mut self, dur: Duration) -> &mut Builder

Sets the maximum number of concurrent locally reset streams.

When a stream is explicitly reset by either calling SendResponse::send_reset or by dropping a SendResponse instance before completing the stream, the HTTP/2 specification requires that any further frames received for that stream must be ignored for “some time”.

In order to satisfy the specification, internal state must be maintained to implement the behavior. This state grows linearly with the number of streams that are locally reset.

The reset_stream_duration setting configures the max amount of time this state will be maintained in memory. Once the duration elapses, the stream state is purged from memory.

Once the stream has been fully purged from memory, any additional frames received for that stream will result in a connection level protocol error, forcing the connection to terminate.

The default value is 30 seconds.

§Examples
// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .reset_stream_duration(Duration::from_secs(10))
    .handshake(my_io);

pub fn enable_connect_protocol(&mut self) -> &mut Builder

pub fn handshake<T, B>(&self, io: T) -> Handshake<T, B>
where T: AsyncRead + AsyncWrite + Unpin, B: Buf,

Creates a new configured HTTP/2 server backed by io.

It is expected that io already be in an appropriate state to commence the HTTP/2 handshake. See Handshake for more details.

Returns a future which resolves to the Connection instance once the HTTP/2 handshake has been completed.

This function also allows the caller to configure the send payload data type. See Outbound data type for more details.

§Examples

Basic usage:

// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut = Builder::new()
    .handshake(my_io);

Configures the send-payload data type. In this case, the outbound data type will be &'static [u8].

// `server_fut` is a future representing the completion of the HTTP/2
// handshake.
let server_fut: Handshake<_, &'static [u8]> = Builder::new()
    .handshake(my_io);

Trait Implementations§

§

impl Clone for Builder

§

fn clone(&self) -> Builder

Returns a copy of the value. Read more
1.0.0 · source§

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

Performs copy-assignment from source. Read more
§

impl Debug for Builder

§

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

Formats the value using the given formatter. Read more
§

impl Default for Builder

§

fn default() -> Builder

Returns the “default value” for a type. Read more

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
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> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

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

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

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> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

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<S, P, B, E>(self, other: P) -> And<T, P>
where T: Policy<S, B, E>, P: Policy<S, B, E>,

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

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

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

impl<T> Same for T

source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
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
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

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<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeSendSync for T