pub struct Builder {
reset_stream_duration: Duration,
initial_max_send_streams: usize,
initial_target_connection_window_size: Option<u32>,
max_send_buffer_size: usize,
reset_stream_max: usize,
pending_accept_reset_stream_max: usize,
settings: Settings,
stream_id: StreamId,
local_max_error_reset_streams: Option<usize>,
}
Expand description
Builds client connections with custom configuration values.
Methods can be chained in order to set the configuration values.
The client 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 client configuration settings.
§Examples
-> Result<((SendRequest<Bytes>, Connection<T, Bytes>)), h2::Error>
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.initial_window_size(1_000_000)
.max_concurrent_streams(1000)
.handshake(my_io);
Fields§
§reset_stream_duration: Duration
Time to keep locally reset streams around before reaping.
initial_max_send_streams: usize
Initial maximum number of locally initiated (send) streams. After receiving a Settings frame from the remote peer, the connection will overwrite this value with the MAX_CONCURRENT_STREAMS specified in the frame.
initial_target_connection_window_size: Option<u32>
Initial target window size for new connections.
max_send_buffer_size: usize
Maximum amount of bytes to “buffer” for writing per stream.
reset_stream_max: usize
Maximum number of locally reset streams to keep at a time.
pending_accept_reset_stream_max: usize
Maximum number of remotely reset streams to allow in the pending accept queue.
settings: Settings
Initial Settings
frame to send as part of the handshake.
stream_id: StreamId
The stream ID of the first (lowest) stream. Subsequent streams will use monotonically increasing stream IDs.
local_max_error_reset_streams: Option<usize>
Maximum number of locally reset streams due to protocol error across the lifetime of the connection.
When this gets exceeded, we issue GOAWAYs.
Implementations§
source§impl Builder
impl Builder
sourcepub fn new() -> Builder
pub fn new() -> Builder
Returns a new client builder instance initialized with default configuration values.
Configuration methods can be chained on the return value.
§Examples
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.initial_window_size(1_000_000)
.max_concurrent_streams(1000)
.handshake(my_io);
sourcepub fn initial_window_size(&mut self, size: u32) -> &mut Self
pub fn initial_window_size(&mut self, size: u32) -> &mut Self
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
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.initial_window_size(1_000_000)
.handshake(my_io);
sourcepub fn initial_connection_window_size(&mut self, size: u32) -> &mut Self
pub fn initial_connection_window_size(&mut self, size: u32) -> &mut Self
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
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.initial_connection_window_size(1_000_000)
.handshake(my_io);
sourcepub fn max_frame_size(&mut self, max: u32) -> &mut Self
pub fn max_frame_size(&mut self, max: u32) -> &mut Self
Indicates the size (in octets) of the largest HTTP/2 frame payload that the configured client 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
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_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.
sourcepub fn max_header_list_size(&mut self, max: u32) -> &mut Self
pub fn max_header_list_size(&mut self, max: u32) -> &mut Self
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
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.max_header_list_size(16 * 1024)
.handshake(my_io);
sourcepub fn max_concurrent_streams(&mut self, max: u32) -> &mut Self
pub fn max_concurrent_streams(&mut self, max: u32) -> &mut Self
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
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.max_concurrent_streams(1000)
.handshake(my_io);
sourcepub fn initial_max_send_streams(&mut self, initial: usize) -> &mut Self
pub fn initial_max_send_streams(&mut self, initial: usize) -> &mut Self
Sets the initial maximum of locally initiated (send) streams.
The initial settings will be overwritten by the remote peer when
the Settings frame is received. The new value will be set to the
max_concurrent_streams()
from the frame.
This setting prevents the caller from exceeding this number of streams that are counted towards the concurrency limit.
Sending streams past the limit returned by the peer will be treated as a stream error of type PROTOCOL_ERROR or REFUSED_STREAM.
See Section 5.1.2 in the HTTP/2 spec for more details.
§Examples
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.initial_max_send_streams(1000)
.handshake(my_io);
sourcepub fn max_concurrent_reset_streams(&mut self, max: usize) -> &mut Self
pub fn max_concurrent_reset_streams(&mut self, max: usize) -> &mut Self
Sets the maximum number of concurrent locally reset streams.
When a stream is explicitly reset, 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
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.max_concurrent_reset_streams(1000)
.handshake(my_io);
sourcepub fn reset_stream_duration(&mut self, dur: Duration) -> &mut Self
pub fn reset_stream_duration(&mut self, dur: Duration) -> &mut Self
Sets the duration to remember locally reset streams.
When a stream is explicitly reset, 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
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.reset_stream_duration(Duration::from_secs(10))
.handshake(my_io);
sourcepub fn max_local_error_reset_streams(&mut self, max: Option<usize>) -> &mut Self
pub fn max_local_error_reset_streams(&mut self, max: Option<usize>) -> &mut Self
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 client will close the connection.
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.
sourcepub fn max_pending_accept_reset_streams(&mut self, max: usize) -> &mut Self
pub fn max_pending_accept_reset_streams(&mut self, max: usize) -> &mut Self
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
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.max_pending_accept_reset_streams(100)
.handshake(my_io);
sourcepub fn max_send_buffer_size(&mut self, max: usize) -> &mut Self
pub fn max_send_buffer_size(&mut self, max: usize) -> &mut Self
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
.
sourcepub fn enable_push(&mut self, enabled: bool) -> &mut Self
pub fn enable_push(&mut self, enabled: bool) -> &mut Self
Enables or disables server push promises.
This value is included in the initial SETTINGS handshake. Setting this value to value to false in the initial SETTINGS handshake guarantees that the remote server will never send a push promise.
This setting can be changed during the life of a single HTTP/2 connection by sending another settings frame updating the value.
Default value: true
.
§Examples
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.enable_push(false)
.handshake(my_io);
sourcepub fn header_table_size(&mut self, size: u32) -> &mut Self
pub fn header_table_size(&mut self, size: u32) -> &mut Self
Sets the header table size.
This setting informs the peer of the maximum size of the header compression table used to encode header blocks, in octets. The encoder may select any value equal to or less than the header table size specified by the sender.
The default value is 4,096.
§Examples
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.header_table_size(1_000_000)
.handshake(my_io);
sourcepub fn handshake<T, B>(
&self,
io: T,
) -> impl Future<Output = Result<(SendRequest<B>, Connection<T, B>), Error>>
pub fn handshake<T, B>( &self, io: T, ) -> impl Future<Output = Result<(SendRequest<B>, Connection<T, B>), Error>>
Creates a new configured HTTP/2 client backed by io
.
It is expected that io
already be in an appropriate state to commence
the HTTP/2 handshake. The handshake is completed once both the connection
preface and the initial settings frame is sent by the client.
The handshake future does not wait for the initial settings frame from the server.
Returns a future which resolves to the Connection
/ SendRequest
tuple 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:
-> Result<((SendRequest<Bytes>, Connection<T, Bytes>)), h2::Error>
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.handshake(my_io);
Configures the send-payload data type. In this case, the outbound data
type will be &'static [u8]
.
// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
let client_fut = Builder::new()
.handshake::<_, &'static [u8]>(my_io);