blob: 77a44df4f65e83a67cdbf01c62e94bd2ecc9db26 [file] [log] [blame]
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Builds client connections with custom configuration values."><meta name="keywords" content="rust, rustlang, rust-lang, Builder"><title>Builder in h2::client - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../../normalize.css"><link rel="stylesheet" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../../ayu.css" disabled><link rel="stylesheet" href="../../dark.css" disabled><link rel="stylesheet" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc struct"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button><a class="sidebar-logo" href="../../h2/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../h2/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"><a href="#">Builder</a></h2><div class="sidebar-elems"><section><h3><a href="#implementations">Methods</a></h3><ul class="block"><li><a href="#method.enable_push">enable_push</a></li><li><a href="#method.handshake">handshake</a></li><li><a href="#method.initial_connection_window_size">initial_connection_window_size</a></li><li><a href="#method.initial_max_send_streams">initial_max_send_streams</a></li><li><a href="#method.initial_window_size">initial_window_size</a></li><li><a href="#method.max_concurrent_reset_streams">max_concurrent_reset_streams</a></li><li><a href="#method.max_concurrent_streams">max_concurrent_streams</a></li><li><a href="#method.max_frame_size">max_frame_size</a></li><li><a href="#method.max_header_list_size">max_header_list_size</a></li><li><a href="#method.max_pending_accept_reset_streams">max_pending_accept_reset_streams</a></li><li><a href="#method.max_send_buffer_size">max_send_buffer_size</a></li><li><a href="#method.new">new</a></li><li><a href="#method.reset_stream_duration">reset_stream_duration</a></li></ul><h3><a href="#trait-implementations">Trait Implementations</a></h3><ul class="block"><li><a href="#impl-Clone-for-Builder">Clone</a></li><li><a href="#impl-Debug-for-Builder">Debug</a></li><li><a href="#impl-Default-for-Builder">Default</a></li></ul><h3><a href="#synthetic-implementations">Auto Trait Implementations</a></h3><ul class="block"><li><a href="#impl-RefUnwindSafe-for-Builder">RefUnwindSafe</a></li><li><a href="#impl-Send-for-Builder">Send</a></li><li><a href="#impl-Sync-for-Builder">Sync</a></li><li><a href="#impl-Unpin-for-Builder">Unpin</a></li><li><a href="#impl-UnwindSafe-for-Builder">UnwindSafe</a></li></ul><h3><a href="#blanket-implementations">Blanket Implementations</a></h3><ul class="block"><li><a href="#impl-Any-for-Builder">Any</a></li><li><a href="#impl-Borrow%3CT%3E-for-Builder">Borrow&lt;T&gt;</a></li><li><a href="#impl-BorrowMut%3CT%3E-for-Builder">BorrowMut&lt;T&gt;</a></li><li><a href="#impl-From%3CT%3E-for-Builder">From&lt;T&gt;</a></li><li><a href="#impl-Instrument-for-Builder">Instrument</a></li><li><a href="#impl-Into%3CU%3E-for-Builder">Into&lt;U&gt;</a></li><li><a href="#impl-ToOwned-for-Builder">ToOwned</a></li><li><a href="#impl-TryFrom%3CU%3E-for-Builder">TryFrom&lt;U&gt;</a></li><li><a href="#impl-TryInto%3CU%3E-for-Builder">TryInto&lt;U&gt;</a></li><li><a href="#impl-WithSubscriber-for-Builder">WithSubscriber</a></li></ul></section><h2><a href="index.html">In h2::client</a></h2></div></nav><main><div class="width-limiter"><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><a href="../../help.html">?</a></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav><section id="main-content" class="content"><div class="main-heading"><h1 class="fqn">Struct <a href="../index.html">h2</a>::<wbr><a href="index.html">client</a>::<wbr><a class="struct" href="#">Builder</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item path"></button></h1><span class="out-of-band"><a class="srclink" href="../../src/h2/client.rs.html#310-339">source</a> · <a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">&#x2212;</span>]</a></span></div><div class="item-decl"><pre class="rust struct"><code>pub struct Builder { /* private fields */ }</code></pre></div><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Builds client connections with custom configuration values.</p>
<p>Methods can be chained in order to set the configuration values.</p>
<p>The client is constructed by calling <a href="struct.Builder.html#method.handshake"><code>handshake</code></a> and passing the I/O
handle that will back the HTTP/2 server.</p>
<p>New instances of <code>Builder</code> are obtained via <a href="struct.Builder.html#method.new"><code>Builder::new</code></a>.</p>
<p>See function level documentation for details on the various client
configuration settings.</p>
<h2 id="examples"><a href="#examples">Examples</a></h2>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code> -&gt; <span class="prelude-ty">Result</span>&lt;((SendRequest&lt;Bytes&gt;, Connection&lt;T, Bytes&gt;)), h2::Error&gt;
<span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.initial_window_size(<span class="number">1_000_000</span>)
.max_concurrent_streams(<span class="number">1000</span>)
.handshake(my_io);</code></pre></div>
</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor"></a></h2><div id="implementations-list"><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-Builder" class="impl has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#609-1155">source</a><a href="#impl-Builder" class="anchor"></a><h3 class="code-header">impl <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.new" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#636-647">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fnname">new</a>() -&gt; <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h4></section></summary><div class="docblock"><p>Returns a new client builder instance initialized with default
configuration values.</p>
<p>Configuration methods can be chained on the return value.</p>
<h5 id="examples-1"><a href="#examples-1">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.initial_window_size(<span class="number">1_000_000</span>)
.max_concurrent_streams(<span class="number">1000</span>)
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.initial_window_size" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#679-682">source</a><h4 class="code-header">pub fn <a href="#method.initial_window_size" class="fnname">initial_window_size</a>(&amp;mut self, size: u32) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Indicates the initial window size (in octets) for stream-level
flow control for received data.</p>
<p>The initial window of a stream is used as part of flow control. For more
details, see <a href="../struct.FlowControl.html"><code>FlowControl</code></a>.</p>
<p>The default value is 65,535.</p>
<h5 id="examples-2"><a href="#examples-2">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.initial_window_size(<span class="number">1_000_000</span>)
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.initial_connection_window_size" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#714-717">source</a><h4 class="code-header">pub fn <a href="#method.initial_connection_window_size" class="fnname">initial_connection_window_size</a>(&amp;mut self, size: u32) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Indicates the initial window size (in octets) for connection-level flow control
for received data.</p>
<p>The initial window of a connection is used as part of flow control. For more details,
see <a href="../struct.FlowControl.html"><code>FlowControl</code></a>.</p>
<p>The default value is 65,535.</p>
<h5 id="examples-3"><a href="#examples-3">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.initial_connection_window_size(<span class="number">1_000_000</span>)
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.max_frame_size" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#753-756">source</a><h4 class="code-header">pub fn <a href="#method.max_frame_size" class="fnname">max_frame_size</a>(&amp;mut self, max: u32) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Indicates the size (in octets) of the largest HTTP/2 frame payload that the
configured client is able to accept.</p>
<p>The sender may send data frames that are <strong>smaller</strong> than this value,
but any data larger than <code>max</code> will be broken up into multiple <code>DATA</code>
frames.</p>
<p>The value <strong>must</strong> be between 16,384 and 16,777,215. The default value is 16,384.</p>
<h5 id="examples-4"><a href="#examples-4">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.max_frame_size(<span class="number">1_000_000</span>)
.handshake(my_io);</code></pre></div>
<h5 id="panics"><a href="#panics">Panics</a></h5>
<p>This function panics if <code>max</code> is not within the legal range specified
above.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.max_header_list_size" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#788-791">source</a><h4 class="code-header">pub fn <a href="#method.max_header_list_size" class="fnname">max_header_list_size</a>(&amp;mut self, max: u32) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Sets the max size of received header frames.</p>
<p>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.</p>
<p>This setting is also used to limit the maximum amount of data that is
buffered to decode HEADERS frames.</p>
<h5 id="examples-5"><a href="#examples-5">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.max_header_list_size(<span class="number">16 </span>* <span class="number">1024</span>)
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.max_concurrent_streams" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#837-840">source</a><h4 class="code-header">pub fn <a href="#method.max_concurrent_streams" class="fnname">max_concurrent_streams</a>(&amp;mut self, max: u32) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Sets the maximum number of concurrent streams.</p>
<p>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.</p>
<p>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 <code>max</code> is set to 0, then the remote will not be permitted to
initiate streams.</p>
<p>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.</p>
<p>Also note that if the remote <em>does</em> exceed the value set here, it is not
a protocol level error. Instead, the <code>h2</code> library will immediately reset
the stream.</p>
<p>See <a href="https://http2.github.io/http2-spec/#rfc.section.5.1.2">Section 5.1.2</a> in the HTTP/2 spec for more details.</p>
<h5 id="examples-6"><a href="#examples-6">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.max_concurrent_streams(<span class="number">1000</span>)
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.initial_max_send_streams" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#878-881">source</a><h4 class="code-header">pub fn <a href="#method.initial_max_send_streams" class="fnname">initial_max_send_streams</a>(&amp;mut self, initial: usize) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Sets the initial maximum of locally initiated (send) streams.</p>
<p>The initial settings will be overwritten by the remote peer when
the Settings frame is received. The new value will be set to the
<code>max_concurrent_streams()</code> from the frame.</p>
<p>This setting prevents the caller from exceeding this number of
streams that are counted towards the concurrency limit.</p>
<p>Sending streams past the limit returned by the peer will be treated
as a stream error of type PROTOCOL_ERROR or REFUSED_STREAM.</p>
<p>See <a href="https://http2.github.io/http2-spec/#rfc.section.5.1.2">Section 5.1.2</a> in the HTTP/2 spec for more details.</p>
<h5 id="examples-7"><a href="#examples-7">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.initial_max_send_streams(<span class="number">1000</span>)
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.max_concurrent_reset_streams" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#923-926">source</a><h4 class="code-header">pub fn <a href="#method.max_concurrent_reset_streams" class="fnname">max_concurrent_reset_streams</a>(&amp;mut self, max: usize) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Sets the maximum number of concurrent locally reset streams.</p>
<p>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”.</p>
<p>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.</p>
<p>The <code>max_concurrent_reset_streams</code> 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.</p>
<p>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.</p>
<p>The default value is 10.</p>
<h5 id="examples-8"><a href="#examples-8">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.max_concurrent_reset_streams(<span class="number">1000</span>)
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.reset_stream_duration" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#969-972">source</a><h4 class="code-header">pub fn <a href="#method.reset_stream_duration" class="fnname">reset_stream_duration</a>(&amp;mut self, dur: Duration) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Sets the duration to remember locally reset streams.</p>
<p>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”.</p>
<p>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.</p>
<p>The <code>reset_stream_duration</code> 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.</p>
<p>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.</p>
<p>The default value is 30 seconds.</p>
<h5 id="examples-9"><a href="#examples-9">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.reset_stream_duration(Duration::from_secs(<span class="number">10</span>))
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.max_pending_accept_reset_streams" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#1012-1015">source</a><h4 class="code-header">pub fn <a href="#method.max_pending_accept_reset_streams" class="fnname">max_pending_accept_reset_streams</a>(&amp;mut self, max: usize) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Sets the maximum number of pending-accept remotely-reset streams.</p>
<p>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.</p>
<p>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.</p>
<p>When the number of remotely-reset streams sitting in the pending-accept
queue reaches this maximum value, a connection error with the code of
<code>ENHANCE_YOUR_CALM</code> will be sent to the peer, and returned by the
<code>Future</code>.</p>
<p>The default value is currently 20, but could change.</p>
<h5 id="examples-10"><a href="#examples-10">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.max_pending_accept_reset_streams(<span class="number">100</span>)
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.max_send_buffer_size" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#1029-1033">source</a><h4 class="code-header">pub fn <a href="#method.max_send_buffer_size" class="fnname">max_send_buffer_size</a>(&amp;mut self, max: usize) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Sets the maximum send buffer size per stream.</p>
<p>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.</p>
<p>The default is currently ~400MB, but may change.</p>
<h5 id="panics-1"><a href="#panics-1">Panics</a></h5>
<p>This function panics if <code>max</code> is larger than <code>u32::MAX</code>.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.enable_push" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#1068-1071">source</a><h4 class="code-header">pub fn <a href="#method.enable_push" class="fnname">enable_push</a>(&amp;mut self, enabled: bool) -&gt; &amp;mut Self</h4></section></summary><div class="docblock"><p>Enables or disables server push promises.</p>
<p>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.</p>
<p>This setting can be changed during the life of a single HTTP/2
connection by sending another settings frame updating the value.</p>
<p>Default value: <code>true</code>.</p>
<h5 id="examples-11"><a href="#examples-11">Examples</a></h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.enable_push(<span class="bool-val">false</span>)
.handshake(my_io);</code></pre></div>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.handshake" class="method has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#1145-1154">source</a><h4 class="code-header">pub fn <a href="#method.handshake" class="fnname">handshake</a>&lt;T, B&gt;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;io: T<br>) -&gt; impl Future&lt;Output = Result&lt;(<a class="struct" href="struct.SendRequest.html" title="struct h2::client::SendRequest">SendRequest</a>&lt;B&gt;, <a class="struct" href="struct.Connection.html" title="struct h2::client::Connection">Connection</a>&lt;T, B&gt;), <a class="struct" href="../struct.Error.html" title="struct h2::Error">Error</a>&gt;&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: <a class="trait" href="../../tokio/io/async_read/trait.AsyncRead.html" title="trait tokio::io::async_read::AsyncRead">AsyncRead</a> + <a class="trait" href="../../tokio/io/async_write/trait.AsyncWrite.html" title="trait tokio::io::async_write::AsyncWrite">AsyncWrite</a> + Unpin,<br>&nbsp;&nbsp;&nbsp;&nbsp;B: <a class="trait" href="../../bytes/buf/buf_impl/trait.Buf.html" title="trait bytes::buf::buf_impl::Buf">Buf</a>,</span></h4></section></summary><div class="docblock"><p>Creates a new configured HTTP/2 client backed by <code>io</code>.</p>
<p>It is expected that <code>io</code> already be in an appropriate state to commence
the <a href="http://httpwg.org/specs/rfc7540.html#ConnectionHeader">HTTP/2 handshake</a>. The handshake is completed once both the connection
preface and the initial settings frame is sent by the client.</p>
<p>The handshake future does not wait for the initial settings frame from the
server.</p>
<p>Returns a future which resolves to the <a href="struct.Connection.html"><code>Connection</code></a> / <a href="struct.SendRequest.html"><code>SendRequest</code></a>
tuple once the HTTP/2 handshake has been completed.</p>
<p>This function also allows the caller to configure the send payload data
type. See <a href="../index.html#outbound-data-type.">Outbound data type</a> for more details.</p>
<h5 id="examples-12"><a href="#examples-12">Examples</a></h5>
<p>Basic usage:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code> -&gt; <span class="prelude-ty">Result</span>&lt;((SendRequest&lt;Bytes&gt;, Connection&lt;T, Bytes&gt;)), h2::Error&gt;
<span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.handshake(my_io);</code></pre></div>
<p>Configures the send-payload data type. In this case, the outbound data
type will be <code>&amp;'static [u8]</code>.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="comment">// `client_fut` is a future representing the completion of the HTTP/2
// handshake.
</span><span class="kw">let </span>client_fut = Builder::new()
.handshake::&lt;<span class="kw">_</span>, <span class="kw-2">&amp;</span><span class="lifetime">&#39;static </span>[u8]&gt;(my_io);</code></pre></div>
</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor"></a></h2><div id="trait-implementations-list"><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-Clone-for-Builder" class="impl has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#309">source</a><a href="#impl-Clone-for-Builder" class="anchor"></a><h3 class="code-header">impl Clone for <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.clone" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#309">source</a><a href="#method.clone" class="anchor"></a><h4 class="code-header">fn <a class="fnname">clone</a>(&amp;self) -&gt; <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h4></section></summary><div class='docblock'>Returns a copy of the value. <a>Read more</a></div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.clone_from" class="method trait-impl has-srclink"><span class="since rightside" title="Stable since Rust version 1.0.0">1.0.0</span><a href="#method.clone_from" class="anchor"></a><h4 class="code-header">const fn <a class="fnname">clone_from</a>(&amp;mut self, source: &amp;Self)</h4></section></summary><div class='docblock'>Performs copy-assignment from <code>source</code>. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-Debug-for-Builder" class="impl has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#309">source</a><a href="#impl-Debug-for-Builder" class="anchor"></a><h3 class="code-header">impl Debug for <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.fmt" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#309">source</a><a href="#method.fmt" class="anchor"></a><h4 class="code-header">fn <a class="fnname">fmt</a>(&amp;self, f: &amp;mut Formatter&lt;'_&gt;) -&gt; Result</h4></section></summary><div class='docblock'>Formats the value using the given formatter. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-Default-for-Builder" class="impl has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#1157-1161">source</a><a href="#impl-Default-for-Builder" class="anchor"></a><h3 class="code-header">impl Default for <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.default" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/h2/client.rs.html#1158-1160">source</a><a href="#method.default" class="anchor"></a><h4 class="code-header">fn <a class="fnname">default</a>() -&gt; <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h4></section></summary><div class='docblock'>Returns the “default value” for a type. <a>Read more</a></div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor"></a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-Builder" class="impl has-srclink"><a href="#impl-RefUnwindSafe-for-Builder" class="anchor"></a><h3 class="code-header">impl RefUnwindSafe for <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h3></section><section id="impl-Send-for-Builder" class="impl has-srclink"><a href="#impl-Send-for-Builder" class="anchor"></a><h3 class="code-header">impl Send for <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h3></section><section id="impl-Sync-for-Builder" class="impl has-srclink"><a href="#impl-Sync-for-Builder" class="anchor"></a><h3 class="code-header">impl Sync for <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h3></section><section id="impl-Unpin-for-Builder" class="impl has-srclink"><a href="#impl-Unpin-for-Builder" class="anchor"></a><h3 class="code-header">impl Unpin for <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h3></section><section id="impl-UnwindSafe-for-Builder" class="impl has-srclink"><a href="#impl-UnwindSafe-for-Builder" class="anchor"></a><h3 class="code-header">impl UnwindSafe for <a class="struct" href="struct.Builder.html" title="struct h2::client::Builder">Builder</a></h3></section></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor"></a></h2><div id="blanket-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Any-for-Builder" class="impl has-srclink"><a href="#impl-Any-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; Any for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: 'static + ?Sized,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl has-srclink"><a href="#method.type_id" class="anchor"></a><h4 class="code-header">fn <a class="fnname">type_id</a>(&amp;self) -&gt; TypeId</h4></section></summary><div class='docblock'>Gets the <code>TypeId</code> of <code>self</code>. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Borrow%3CT%3E-for-Builder" class="impl has-srclink"><a href="#impl-Borrow%3CT%3E-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; Borrow&lt;T&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: ?Sized,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/91522" title="Tracking issue for const_borrow">unstable</a></span><a href="#method.borrow" class="anchor"></a><h4 class="code-header">fn <a class="fnname">borrow</a>(&amp;self) -&gt; &amp;T</h4></section></summary><div class='docblock'>Immutably borrows from an owned value. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-BorrowMut%3CT%3E-for-Builder" class="impl has-srclink"><a href="#impl-BorrowMut%3CT%3E-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; BorrowMut&lt;T&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: ?Sized,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/91522" title="Tracking issue for const_borrow">unstable</a></span><a href="#method.borrow_mut" class="anchor"></a><h4 class="code-header">fn <a class="fnname">borrow_mut</a>(&amp;mut self) -&gt; &amp;mut T</h4></section></summary><div class='docblock'>Mutably borrows from an owned value. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-From%3CT%3E-for-Builder" class="impl has-srclink"><a href="#impl-From%3CT%3E-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; From&lt;T&gt; for T</h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.from" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span><a href="#method.from" class="anchor"></a><h4 class="code-header">fn <a class="fnname">from</a>(t: T) -&gt; T</h4></section></summary><div class="docblock"><p>Returns the argument unchanged.</p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Instrument-for-Builder" class="impl has-srclink"><a class="srclink rightside" href="../../src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="../../tracing/instrument/trait.Instrument.html" title="trait tracing::instrument::Instrument">Instrument</a> for T</h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.instrument" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/tracing/instrument.rs.html#82">source</a><a href="#method.instrument" class="anchor"></a><h4 class="code-header">fn <a href="../../tracing/instrument/trait.Instrument.html#method.instrument" class="fnname">instrument</a>(self, span: <a class="struct" href="../../tracing/span/struct.Span.html" title="struct tracing::span::Span">Span</a>) -&gt; <a class="struct" href="../../tracing/instrument/struct.Instrumented.html" title="struct tracing::instrument::Instrumented">Instrumented</a>&lt;Self&gt;</h4></section></summary><div class='docblock'>Instruments this type with the provided <a href="../../tracing/span/struct.Span.html" title="Span"><code>Span</code></a>, returning an
<code>Instrumented</code> wrapper. <a href="../../tracing/instrument/trait.Instrument.html#method.instrument">Read more</a></div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.in_current_span" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/tracing/instrument.rs.html#121">source</a><a href="#method.in_current_span" class="anchor"></a><h4 class="code-header">fn <a href="../../tracing/instrument/trait.Instrument.html#method.in_current_span" class="fnname">in_current_span</a>(self) -&gt; <a class="struct" href="../../tracing/instrument/struct.Instrumented.html" title="struct tracing::instrument::Instrumented">Instrumented</a>&lt;Self&gt;</h4></section></summary><div class='docblock'>Instruments this type with the <a href="../../tracing/span/struct.Span.html#method.current">current</a> <a href="../../tracing/span/struct.Span.html"><code>Span</code></a>, returning an
<code>Instrumented</code> wrapper. <a href="../../tracing/instrument/trait.Instrument.html#method.in_current_span">Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-Builder" class="impl has-srclink"><a href="#impl-Into%3CU%3E-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T, U&gt; Into&lt;U&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;U: From&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.into" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span><a href="#method.into" class="anchor"></a><h4 class="code-header">fn <a class="fnname">into</a>(self) -&gt; U</h4></section></summary><div class="docblock"><p>Calls <code>U::from(self)</code>.</p>
<p>That is, this conversion is whatever the implementation of
<code>[From]&lt;T&gt; for U</code> chooses to do.</p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-ToOwned-for-Builder" class="impl has-srclink"><a href="#impl-ToOwned-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; ToOwned for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: Clone,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><section id="associatedtype.Owned" class="associatedtype trait-impl has-srclink"><a href="#associatedtype.Owned" class="anchor"></a><h4 class="code-header">type <a class="associatedtype">Owned</a> = T</h4></section></summary><div class='docblock'>The resulting type after obtaining ownership.</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.to_owned" class="method trait-impl has-srclink"><a href="#method.to_owned" class="anchor"></a><h4 class="code-header">fn <a class="fnname">to_owned</a>(&amp;self) -&gt; T</h4></section></summary><div class='docblock'>Creates owned data from borrowed data, usually by cloning. <a>Read more</a></div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.clone_into" class="method trait-impl has-srclink"><a href="#method.clone_into" class="anchor"></a><h4 class="code-header">fn <a class="fnname">clone_into</a>(&amp;self, target: &amp;mut T)</h4></section></summary><div class='docblock'>Uses borrowed data to replace owned data, usually by cloning. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-TryFrom%3CU%3E-for-Builder" class="impl has-srclink"><a href="#impl-TryFrom%3CU%3E-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T, U&gt; TryFrom&lt;U&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;U: Into&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl has-srclink"><a href="#associatedtype.Error-1" class="anchor"></a><h4 class="code-header">type <a class="associatedtype">Error</a> = Infallible</h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.try_from" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span><a href="#method.try_from" class="anchor"></a><h4 class="code-header">fn <a class="fnname">try_from</a>(value: U) -&gt; Result&lt;T, &lt;T as TryFrom&lt;U&gt;&gt;::Error&gt;</h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-TryInto%3CU%3E-for-Builder" class="impl has-srclink"><a href="#impl-TryInto%3CU%3E-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T, U&gt; TryInto&lt;U&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;U: TryFrom&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl has-srclink"><a href="#associatedtype.Error" class="anchor"></a><h4 class="code-header">type <a class="associatedtype">Error</a> = &lt;U as TryFrom&lt;T&gt;&gt;::Error</h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.try_into" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span><a href="#method.try_into" class="anchor"></a><h4 class="code-header">fn <a class="fnname">try_into</a>(self) -&gt; Result&lt;U, &lt;U as TryFrom&lt;T&gt;&gt;::Error&gt;</h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-Builder" class="impl has-srclink"><a class="srclink rightside" href="../../src/tracing/instrument.rs.html#334">source</a><a href="#impl-WithSubscriber-for-Builder" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="../../tracing/instrument/trait.WithSubscriber.html" title="trait tracing::instrument::WithSubscriber">WithSubscriber</a> for T</h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.with_subscriber" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/tracing/instrument.rs.html#169-171">source</a><a href="#method.with_subscriber" class="anchor"></a><h4 class="code-header">fn <a href="../../tracing/instrument/trait.WithSubscriber.html#method.with_subscriber" class="fnname">with_subscriber</a>&lt;S&gt;(self, subscriber: S) -&gt; <a class="struct" href="../../tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch">WithDispatch</a>&lt;Self&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;S: Into&lt;<a class="struct" href="../../tracing_core/dispatcher/struct.Dispatch.html" title="struct tracing_core::dispatcher::Dispatch">Dispatch</a>&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="../../tracing_core/subscriber/trait.Subscriber.html"><code>Subscriber</code></a> to this type, returning a
<a href="../../tracing/instrument/struct.WithDispatch.html" title="WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="../../tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/tracing/instrument.rs.html#221">source</a><a href="#method.with_current_subscriber" class="anchor"></a><h4 class="code-header">fn <a href="../../tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber" class="fnname">with_current_subscriber</a>(self) -&gt; <a class="struct" href="../../tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch">WithDispatch</a>&lt;Self&gt;</h4></section></summary><div class='docblock'>Attaches the current <a href="../../tracing/dispatcher/index.html#setting-the-default-subscriber">default</a> <a href="../../tracing_core/subscriber/trait.Subscriber.html"><code>Subscriber</code></a> to this type, returning a
<a href="../../tracing/instrument/struct.WithDispatch.html" title="WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="../../tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="h2" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.66.0-nightly (5c8bff74b 2022-10-21)" ></div></body></html>