perf(body): move h2 flow control from Chunk to h2 variant of Body
This commit is contained in:
@@ -290,7 +290,8 @@ impl Body {
|
|||||||
.map(|async| {
|
.map(|async| {
|
||||||
async.map(|opt| {
|
async.map(|opt| {
|
||||||
opt.map(|bytes| {
|
opt.map(|bytes| {
|
||||||
Chunk::h2(bytes, h2.release_capacity())
|
let _ = h2.release_capacity().release_capacity(bytes.len());
|
||||||
|
Chunk::from(bytes)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
31
src/chunk.rs
31
src/chunk.rs
@@ -1,23 +1,16 @@
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use bytes::{Buf, Bytes};
|
use bytes::{Buf, Bytes};
|
||||||
use h2::ReleaseCapacity;
|
|
||||||
|
|
||||||
/// A piece of a message body.
|
/// A piece of a message body.
|
||||||
///
|
///
|
||||||
/// These are returned by [`Body`](::Body). It is an efficient buffer type,
|
/// These are returned by [`Body`](::Body). It is an efficient buffer type.
|
||||||
/// and wraps auto-management of flow control in the case of HTTP2 messages.
|
|
||||||
///
|
///
|
||||||
/// A `Chunk` can be easily created by many of Rust's standard types that
|
/// A `Chunk` can be easily created by many of Rust's standard types that
|
||||||
/// represent a collection of bytes, using `Chunk::from`.
|
/// represent a collection of bytes, using `Chunk::from`.
|
||||||
pub struct Chunk {
|
pub struct Chunk {
|
||||||
/// The buffer of bytes making up this body.
|
/// The buffer of bytes making up this body.
|
||||||
bytes: Bytes,
|
bytes: Bytes,
|
||||||
/// A possible HTTP2 marker to ensure we release window capacity.
|
|
||||||
///
|
|
||||||
/// This version just automatically releases all capacity when `Chunk`
|
|
||||||
/// is dropped.
|
|
||||||
_flow_control: Option<AutoRelease>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// An unexported type to prevent locking `Chunk::into_iter()` to `Bytes::into_iter()`.
|
// An unexported type to prevent locking `Chunk::into_iter()` to `Bytes::into_iter()`.
|
||||||
@@ -26,29 +19,8 @@ pub struct IntoIter {
|
|||||||
inner: <Bytes as IntoIterator>::IntoIter,
|
inner: <Bytes as IntoIterator>::IntoIter,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AutoRelease {
|
|
||||||
cap: usize,
|
|
||||||
release: ReleaseCapacity,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for AutoRelease {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
let _ = self.release.release_capacity(self.cap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Chunk {
|
impl Chunk {
|
||||||
pub(crate) fn h2(bytes: Bytes, rel_cap: &ReleaseCapacity) -> Chunk {
|
|
||||||
let cap = bytes.len();
|
|
||||||
Chunk {
|
|
||||||
bytes: bytes,
|
|
||||||
_flow_control: Some(AutoRelease {
|
|
||||||
cap: cap,
|
|
||||||
release: rel_cap.clone(),
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Converts this `Chunk` directly into the `Bytes` type without copies.
|
/// Converts this `Chunk` directly into the `Bytes` type without copies.
|
||||||
///
|
///
|
||||||
/// This is simply an inherent alias for `Bytes::from(chunk)`, which exists,
|
/// This is simply an inherent alias for `Bytes::from(chunk)`, which exists,
|
||||||
@@ -109,7 +81,6 @@ impl From<Bytes> for Chunk {
|
|||||||
fn from(bytes: Bytes) -> Chunk {
|
fn from(bytes: Bytes) -> Chunk {
|
||||||
Chunk {
|
Chunk {
|
||||||
bytes: bytes,
|
bytes: bytes,
|
||||||
_flow_control: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user