blob: d5884ba0a2d972713dcc00d46846da0611755242 [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="Sends the body stream and trailers to the remote peer."><meta name="keywords" content="rust, rustlang, rust-lang, SendStream"><title>SendStream in h2 - 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="#">SendStream</a></h2><div class="sidebar-elems"><section><h3><a href="#implementations">Methods</a></h3><ul class="block"><li><a href="#method.capacity">capacity</a></li><li><a href="#method.poll_capacity">poll_capacity</a></li><li><a href="#method.poll_reset">poll_reset</a></li><li><a href="#method.reserve_capacity">reserve_capacity</a></li><li><a href="#method.send_data">send_data</a></li><li><a href="#method.send_reset">send_reset</a></li><li><a href="#method.send_trailers">send_trailers</a></li><li><a href="#method.stream_id">stream_id</a></li></ul><h3><a href="#trait-implementations">Trait Implementations</a></h3><ul class="block"><li><a href="#impl-Debug-for-SendStream%3CB%3E">Debug</a></li></ul><h3><a href="#synthetic-implementations">Auto Trait Implementations</a></h3><ul class="block"><li><a href="#impl-RefUnwindSafe-for-SendStream%3CB%3E">RefUnwindSafe</a></li><li><a href="#impl-Send-for-SendStream%3CB%3E">Send</a></li><li><a href="#impl-Sync-for-SendStream%3CB%3E">Sync</a></li><li><a href="#impl-Unpin-for-SendStream%3CB%3E">Unpin</a></li><li><a href="#impl-UnwindSafe-for-SendStream%3CB%3E">UnwindSafe</a></li></ul><h3><a href="#blanket-implementations">Blanket Implementations</a></h3><ul class="block"><li><a href="#impl-Any-for-SendStream%3CB%3E">Any</a></li><li><a href="#impl-Borrow%3CT%3E-for-SendStream%3CB%3E">Borrow&lt;T&gt;</a></li><li><a href="#impl-BorrowMut%3CT%3E-for-SendStream%3CB%3E">BorrowMut&lt;T&gt;</a></li><li><a href="#impl-From%3CT%3E-for-SendStream%3CB%3E">From&lt;T&gt;</a></li><li><a href="#impl-Instrument-for-SendStream%3CB%3E">Instrument</a></li><li><a href="#impl-Into%3CU%3E-for-SendStream%3CB%3E">Into&lt;U&gt;</a></li><li><a href="#impl-TryFrom%3CU%3E-for-SendStream%3CB%3E">TryFrom&lt;U&gt;</a></li><li><a href="#impl-TryInto%3CU%3E-for-SendStream%3CB%3E">TryInto&lt;U&gt;</a></li><li><a href="#impl-WithSubscriber-for-SendStream%3CB%3E">WithSubscriber</a></li></ul></section><h2><a href="index.html">In h2</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 class="struct" href="#">SendStream</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/share.rs.html#97-99">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 SendStream&lt;B&gt; { /* private fields */ }</code></pre></div><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Sends the body stream and trailers to the remote peer.</p>
<h2 id="overview"><a href="#overview">Overview</a></h2>
<p>A <code>SendStream</code> is provided by <a href="client/struct.SendRequest.html"><code>SendRequest</code></a> and <a href="server/struct.SendResponse.html"><code>SendResponse</code></a> once the
HTTP/2 message header has been sent sent. It is used to stream the message
body and send the message trailers. See method level documentation for more
details.</p>
<p>The <code>SendStream</code> instance is also used to manage outbound flow control.</p>
<p>If a <code>SendStream</code> is dropped without explicitly closing the send stream, a
<code>RST_STREAM</code> frame will be sent. This essentially cancels the request /
response exchange.</p>
<p>The ways to explicitly close the send stream are:</p>
<ul>
<li>Set <code>end_of_stream</code> to true when calling <a href="client/struct.SendRequest.html#method.send_request"><code>send_request</code></a>,
<a href="server/struct.SendResponse.html#method.send_response"><code>send_response</code></a>, or <a href="#method.send_data"><code>send_data</code></a>.</li>
<li>Send trailers with <a href="#method.send_trailers"><code>send_trailers</code></a>.</li>
<li>Explicitly reset the stream with <a href="#method.send_reset"><code>send_reset</code></a>.</li>
</ul>
<h2 id="flow-control"><a href="#flow-control">Flow control</a></h2>
<p>In HTTP/2, data cannot be sent to the remote peer unless there is
available window capacity on both the stream and the connection. When a data
frame is sent, both the stream window and the connection window are
decremented. When the stream level window reaches zero, no further data can
be sent on that stream. When the connection level window reaches zero, no
further data can be sent on any stream for that connection.</p>
<p>When the remote peer is ready to receive more data, it sends <code>WINDOW_UPDATE</code>
frames. These frames increment the windows. See the <a href="http://httpwg.org/specs/rfc7540.html#FlowControl">specification</a> for more
details on the principles of HTTP/2 flow control.</p>
<p>The implications for sending data are that the caller <strong>should</strong> ensure that
both the stream and the connection has available window capacity before
loading the data to send into memory. The <code>SendStream</code> instance provides the
necessary APIs to perform this logic. This, however, is not an obligation.
If the caller attempts to send data on a stream when there is no available
window capacity, the library will buffer the data until capacity becomes
available, at which point the buffer will be flushed to the connection.</p>
<p><strong>NOTE</strong>: There is no bound on the amount of data that the library will
buffer. If you are sending large amounts of data, you really should hook
into the flow control lifecycle. Otherwise, you risk using up significant
amounts of memory.</p>
<p>To hook into the flow control lifecycle, the caller signals to the library
that it intends to send data by calling <a href="#method.reserve_capacity"><code>reserve_capacity</code></a>, specifying the
amount of data, in octets, that the caller intends to send. After this,
<code>poll_capacity</code> is used to be notified when the requested capacity is
assigned to the stream. Once <a href="#method.poll_capacity"><code>poll_capacity</code></a> returns <code>Ready</code> with the number
of octets available to the stream, the caller is able to actually send the
data using <a href="#method.send_data"><code>send_data</code></a>.</p>
<p>Because there is also a connection level window that applies to <strong>all</strong>
streams on a connection, when capacity is assigned to a stream (indicated by
<code>poll_capacity</code> returning <code>Ready</code>), this capacity is reserved on the
connection and will <strong>not</strong> be assigned to any other stream. If data is
never written to the stream, that capacity is effectively lost to other
streams and this introduces the risk of deadlocking a connection.</p>
<p>To avoid throttling data on a connection, the caller should not reserve
capacity until ready to send data and once any capacity is assigned to the
stream, the caller should immediately send data consuming this capacity.
There is no guarantee as to when the full capacity requested will become
available. For example, if the caller requests 64 KB of data and 512 bytes
become available, the caller should immediately send 512 bytes of data.</p>
<p>See <a href="#method.reserve_capacity"><code>reserve_capacity</code></a> documentation for more details.</p>
</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-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#222-383">source</a><a href="#impl-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;B:&nbsp;<a class="trait" href="../bytes/buf/buf_impl/trait.Buf.html" title="trait bytes::buf::buf_impl::Buf">Buf</a>&gt; <a class="struct" href="struct.SendStream.html" title="struct h2::SendStream">SendStream</a>&lt;B&gt;</h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.reserve_capacity" class="method has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#285-288">source</a><h4 class="code-header">pub fn <a href="#method.reserve_capacity" class="fnname">reserve_capacity</a>(&amp;mut self, capacity: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>)</h4></section></summary><div class="docblock"><p>Requests capacity to send data.</p>
<p>This function is used to express intent to send data. This requests
connection level capacity. Once the capacity is available, it is
assigned to the stream and not reused by other streams.</p>
<p>This function may be called repeatedly. The <code>capacity</code> argument is the
<strong>total</strong> amount of requested capacity. Sequential calls to
<code>reserve_capacity</code> are <em>not</em> additive. Given the following:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code>send_stream.reserve_capacity(<span class="number">100</span>);
send_stream.reserve_capacity(<span class="number">200</span>);</code></pre></div>
<p>After the second call to <code>reserve_capacity</code>, the <em>total</em> requested
capacity will be 200.</p>
<p><code>reserve_capacity</code> is also used to cancel previous capacity requests.
Given the following:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code>send_stream.reserve_capacity(<span class="number">100</span>);
send_stream.reserve_capacity(<span class="number">0</span>);</code></pre></div>
<p>After the second call to <code>reserve_capacity</code>, the <em>total</em> requested
capacity will be 0, i.e. there is no requested capacity for the stream.</p>
<p>If <code>reserve_capacity</code> is called with a lower value than the amount of
capacity <strong>currently</strong> assigned to the stream, this capacity will be
returned to the connection to be re-assigned to other streams.</p>
<p>Also, the amount of capacity that is reserved gets decremented as data
is sent. For example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code>send_stream.reserve_capacity(<span class="number">100</span>);
send_stream.send_data(<span class="string">b&quot;hello&quot;</span>, <span class="bool-val">false</span>).unwrap();
<span class="comment">// At this point, the total amount of requested capacity is 95 bytes.
// Calling `reserve_capacity` with `100` again essentially requests an
// additional 5 bytes.
</span>send_stream.reserve_capacity(<span class="number">100</span>);</code></pre></div>
<p>See <a href="struct.SendStream.html#flow-control">Flow control</a> for an overview
of how send flow control works.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.capacity" class="method has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#294-296">source</a><h4 class="code-header">pub fn <a href="#method.capacity" class="fnname">capacity</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a></h4></section></summary><div class="docblock"><p>Returns the stream’s current send capacity.</p>
<p>This allows the caller to check the current amount of available capacity
before sending data.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.poll_capacity" class="method has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#312-317">source</a><h4 class="code-header">pub fn <a href="#method.poll_capacity" class="fnname">poll_capacity</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;mut self,<br>&nbsp;&nbsp;&nbsp;&nbsp;cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;<br>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="struct" href="struct.Error.html" title="struct h2::Error">Error</a>&gt;&gt;&gt;</h4></section></summary><div class="docblock"><p>Requests to be notified when the stream’s capacity increases.</p>
<p>Before calling this, capacity should be requested with
<code>reserve_capacity</code>. Once capacity is requested, the connection will
assign capacity to the stream <strong>as it becomes available</strong>. There is no
guarantee as to when and in what increments capacity gets assigned to
the stream.</p>
<p>To get notified when the available capacity increases, the caller calls
<code>poll_capacity</code>, which returns <code>Ready(Some(n))</code> when <code>n</code> has been
increased by the connection. Note that <code>n</code> here represents the <strong>total</strong>
amount of assigned capacity at that point in time. It is also possible
that <code>n</code> is lower than the previous call if, since then, the caller has
sent data.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.send_data" class="method has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#334-338">source</a><h4 class="code-header">pub fn <a href="#method.send_data" class="fnname">send_data</a>(&amp;mut self, data: B, end_of_stream: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>, <a class="struct" href="struct.Error.html" title="struct h2::Error">Error</a>&gt;</h4></section></summary><div class="docblock"><p>Sends a single data frame to the remote peer.</p>
<p>This function may be called repeatedly as long as <code>end_of_stream</code> is set
to <code>false</code>. Setting <code>end_of_stream</code> to <code>true</code> sets the end stream flag
on the data frame. Any further calls to <code>send_data</code> or <code>send_trailers</code>
will return an <a href="struct.Error.html"><code>Error</code></a>.</p>
<p><code>send_data</code> can be called without reserving capacity. In this case, the
data is buffered and the capacity is implicitly requested. Once the
capacity becomes available, the data is flushed to the connection.
However, this buffering is unbounded. As such, sending large amounts of
data without reserving capacity before hand could result in large
amounts of data being buffered in memory.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.send_trailers" class="method has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#344-346">source</a><h4 class="code-header">pub fn <a href="#method.send_trailers" class="fnname">send_trailers</a>(&amp;mut self, trailers: <a class="struct" href="../http/header/map/struct.HeaderMap.html" title="struct http::header::map::HeaderMap">HeaderMap</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>, <a class="struct" href="struct.Error.html" title="struct h2::Error">Error</a>&gt;</h4></section></summary><div class="docblock"><p>Sends trailers to the remote peer.</p>
<p>Sending trailers implicitly closes the send stream. Once the send stream
is closed, no more data can be sent.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.send_reset" class="method has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#355-357">source</a><h4 class="code-header">pub fn <a href="#method.send_reset" class="fnname">send_reset</a>(&amp;mut self, reason: <a class="struct" href="struct.Reason.html" title="struct h2::Reason">Reason</a>)</h4></section></summary><div class="docblock"><p>Resets the stream.</p>
<p>This cancels the request / response exchange. If the response has not
yet been received, the associated <code>ResponseFuture</code> will return an
<a href="struct.Error.html"><code>Error</code></a> to reflect the canceled exchange.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.poll_reset" class="method has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#371-373">source</a><h4 class="code-header">pub fn <a href="#method.poll_reset" class="fnname">poll_reset</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="struct" href="struct.Reason.html" title="struct h2::Reason">Reason</a>, <a class="struct" href="struct.Error.html" title="struct h2::Error">Error</a>&gt;&gt;</h4></section></summary><div class="docblock"><p>Polls to be notified when the client resets this stream.</p>
<p>If stream is still open, this returns <code>Poll::Pending</code>, and
registers the task to be notified if a <code>RST_STREAM</code> is received.</p>
<p>If a <code>RST_STREAM</code> frame is received for this stream, calling this
method will yield the <code>Reason</code> for the reset.</p>
<h5 id="error"><a href="#error">Error</a></h5>
<p>If connection sees an error, this returns that error instead of a
<code>Reason</code>.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.stream_id" class="method has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#380-382">source</a><h4 class="code-header">pub fn <a href="#method.stream_id" class="fnname">stream_id</a>(&amp;self) -&gt; <a class="struct" href="struct.StreamId.html" title="struct h2::StreamId">StreamId</a></h4></section></summary><div class="docblock"><p>Returns the stream ID of this <code>SendStream</code>.</p>
<h5 id="panics"><a href="#panics">Panics</a></h5>
<p>If the lock on the stream store has been poisoned.</p>
</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-Debug-for-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="../src/h2/share.rs.html#96">source</a><a href="#impl-Debug-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;B:&nbsp;<a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a>&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="struct.SendStream.html" title="struct h2::SendStream">SendStream</a>&lt;B&gt;</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/share.rs.html#96">source</a><a href="#method.fmt" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt" class="fnname">fmt</a>(&amp;self, f: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>&lt;'_&gt;) -&gt; <a class="type" href="https://doc.rust-lang.org/nightly/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></h4></section></summary><div class='docblock'>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt">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-SendStream%3CB%3E" class="impl has-srclink"><a href="#impl-RefUnwindSafe-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;B&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="struct.SendStream.html" title="struct h2::SendStream">SendStream</a>&lt;B&gt;</h3></section><section id="impl-Send-for-SendStream%3CB%3E" class="impl has-srclink"><a href="#impl-Send-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;B&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="struct.SendStream.html" title="struct h2::SendStream">SendStream</a>&lt;B&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;B: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Sync-for-SendStream%3CB%3E" class="impl has-srclink"><a href="#impl-Sync-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;B&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.SendStream.html" title="struct h2::SendStream">SendStream</a>&lt;B&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;B: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Unpin-for-SendStream%3CB%3E" class="impl has-srclink"><a href="#impl-Unpin-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;B&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.SendStream.html" title="struct h2::SendStream">SendStream</a>&lt;B&gt;</h3></section><section id="impl-UnwindSafe-for-SendStream%3CB%3E" class="impl has-srclink"><a href="#impl-UnwindSafe-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;B&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a> for <a class="struct" href="struct.SendStream.html" title="struct h2::SendStream">SendStream</a>&lt;B&gt;</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-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#200">source</a><a href="#impl-Any-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</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 class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#201">source</a><a href="#method.type_id" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id" class="fnname">type_id</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></h4></section></summary><div class='docblock'>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id">Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Borrow%3CT%3E-for-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211">source</a><a href="#impl-Borrow%3CT%3E-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;T&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</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="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/91522" title="Tracking issue for const_borrow">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#213">source</a></span><a href="#method.borrow" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow" class="fnname">borrow</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;</a>T</h4></section></summary><div class='docblock'>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-BorrowMut%3CT%3E-for-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#220">source</a><a href="#impl-BorrowMut%3CT%3E-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;T&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</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="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/91522" title="Tracking issue for const_borrow">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221">source</a></span><a href="#method.borrow_mut" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut" class="fnname">borrow_mut</a>(&amp;mut self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>T</h4></section></summary><div class='docblock'>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-From%3CT%3E-for-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#733">source</a><a href="#impl-From%3CT%3E-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a>&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="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#736">source</a></span><a href="#method.from" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from" 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-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="../src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-SendStream%3CB%3E" 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-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#717">source</a><a href="#impl-Into%3CU%3E-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;U&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="trait core::convert::From">From</a>&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="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#725">source</a></span><a href="#method.into" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into" 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><a href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html" title="From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-TryFrom%3CU%3E-for-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#775">source</a><a href="#impl-TryFrom%3CU%3E-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;U&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&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 href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" class="associatedtype">Error</a> = <a class="enum" href="https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html" title="enum core::convert::Infallible">Infallible</a></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="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#781">source</a></span><a href="#method.try_from" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from" class="fnname">try_from</a>(value: U) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;T, &lt;T as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;U&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>&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-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#760">source</a><a href="#impl-TryInto%3CU%3E-for-SendStream%3CB%3E" class="anchor"></a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html" title="trait core::convert::TryInto">TryInto</a>&lt;U&gt; for T<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;U: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&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 href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error" class="associatedtype">Error</a> = &lt;U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a></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="rightside"><span class="since" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span> · <a class="srclink" href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#766">source</a></span><a href="#method.try_into" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into" class="fnname">try_into</a>(self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;U, &lt;U as <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>&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-SendStream%3CB%3E" class="impl has-srclink"><a class="srclink rightside" href="../src/tracing/instrument.rs.html#334">source</a><a href="#impl-WithSubscriber-for-SendStream%3CB%3E" 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: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&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>