Struct h2::FlowControl [−][src]
A handle to release window capacity to a remote stream.
This type allows the caller to manage inbound data flow control. The
caller is expected to call release_capacity
after dropping data frames.
Overview
Each stream has a window size. This window size is the maximum amount of inbound data that can be in-flight. In-flight data is defined as data that has been received, but not yet released.
When a stream is created, the window size is set to the connection’s initial
window size value. When a data frame is received, the window size is then
decremented by size of the data frame before the data is provided to the
caller. As the caller finishes using the data, release_capacity
must be
called. This will then increment the window size again, allowing the peer to
send more data.
There is also a connection level window as well as the stream level window.
Received data counts against the connection level window as well and calls
to release_capacity
will also increment the connection level window.
Sending WINDOW_UPDATE
frames
WINDOW_UPDATE
frames will not be sent out for every call to
release_capacity
, as this would end up slowing down the protocol. Instead,
h2
waits until the window size is increased to a certain threshold and
then sends out a single WINDOW_UPDATE
frame representing all the calls to
release_capacity
since the last WINDOW_UPDATE
frame.
This essentially batches window updating.
Scenarios
Following is a basic scenario with an HTTP/2.0 connection containing a single active stream.
- A new stream is activated. The receive window is initialized to 1024 (the value of the initial window size for this connection).
- A
DATA
frame is received containing a payload of 400 bytes. - The receive window size is reduced to 424 bytes.
release_capacity
is called with 200.- The receive window size is now 624 bytes. The peer may send no more than this.
- A
DATA
frame is received with a payload of 624 bytes. - The window size is now 0 bytes. The peer may not send any more data.
release_capacity
is called with 1024.- The receive window size is now 1024 bytes. The peer may now send more data.
Implementations
impl FlowControl
[src]
pub fn stream_id(&self) -> StreamId
[src]
Returns the stream ID of the stream whose capacity will
be released by this FlowControl
.
pub fn available_capacity(&self) -> isize
[src]
Get the current available capacity of data this stream could receive.
pub fn used_capacity(&self) -> usize
[src]
Get the currently used capacity for this stream.
This is the amount of bytes that can be released back to the remote.
pub fn release_capacity(&mut self, sz: usize) -> Result<(), Error>
[src]
Release window capacity back to remote stream.
This releases capacity back to the stream level and the connection level
windows. Both window sizes will be increased by sz
.
See struct level documentation for more details.
Errors
This function errors if increasing the receive window size by sz
would
result in a window size greater than the target window size. In other
words, the caller cannot release more capacity than data has been
received. If 1024 bytes of data have been received, at most 1024 bytes
can be released.
Trait Implementations
impl Clone for FlowControl
[src]
fn clone(&self) -> FlowControl
[src]
pub fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl Debug for FlowControl
[src]
Auto Trait Implementations
impl RefUnwindSafe for FlowControl
impl Send for FlowControl
impl Sync for FlowControl
impl Unpin for FlowControl
impl UnwindSafe for FlowControl
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T> Instrument for T
[src]
pub fn instrument(self, span: Span) -> Instrumented<Self>
[src]
pub fn in_current_span(self) -> Instrumented<Self>
[src]
impl<T> Instrument for T
[src]
pub fn instrument(self, span: Span) -> Instrumented<Self>
[src]
pub fn in_current_span(self) -> Instrumented<Self>
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> Pointable for T
[src]
pub const ALIGN: usize
[src]
type Init = T
The type for initializers.
pub unsafe fn init(init: <T as Pointable>::Init) -> usize
[src]
pub unsafe fn deref<'a>(ptr: usize) -> &'a T
[src]
pub unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T
[src]
pub unsafe fn drop(ptr: usize)
[src]
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T> WithSubscriber for T
[src]
pub fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
[src]
S: Into<Dispatch>,