pub struct PartialBufferedBody<B>where
B: HttpBody,{ /* private fields */ }Expand description
A partially consumed body: buffered prefix plus remaining stream.
Created when a predicate or extractor reads some bytes from a body stream
without consuming it entirely. Implements HttpBody to transparently
replay the buffered prefix followed by the remaining stream data.
§When You’ll Encounter This
You typically don’t create this directly. It appears inside
BufferedBody::Partial after operations like collect_exact.
§Invariants
- The prefix contains bytes already read from the original stream
- The remaining stream has not been polled since the prefix was extracted
- When polled as
HttpBody, prefix bytes are yielded before remaining data
§Streaming Behavior
When polled as an HttpBody:
- Yields the buffered prefix (if any) as a single frame
- Delegates to the remaining stream, or yields the stored error
§Examples
use bytes::Bytes;
use hitbox_http::{BufferedBody, PartialBufferedBody, Remaining};
fn example<B: hyper::body::Body>(body: BufferedBody<B>) {
// Decompose a partial body
if let BufferedBody::Partial(partial) = body {
let prefix: Option<&Bytes> = partial.prefix();
println!("Buffered {} bytes", prefix.map(|b| b.len()).unwrap_or(0));
let (prefix, remaining) = partial.into_parts();
// Can now handle prefix and remaining separately
}
}§Performance
The prefix is yielded as a single frame, avoiding per-byte overhead. The remaining stream is passed through without additional buffering.
Implementations§
Source§impl<B> PartialBufferedBody<B>where
B: HttpBody,
impl<B> PartialBufferedBody<B>where
B: HttpBody,
Sourcepub fn new(prefix: Option<Bytes>, remaining: Remaining<B>) -> Self
pub fn new(prefix: Option<Bytes>, remaining: Remaining<B>) -> Self
Constructs a partial body for transparent stream replay.
When this body is polled as HttpBody, the prefix bytes are yielded
first as a single frame, followed by the remaining stream data (or error).
This enables predicates to inspect body content without losing data.
Sourcepub fn prefix(&self) -> Option<&Bytes>
pub fn prefix(&self) -> Option<&Bytes>
Returns the bytes already consumed from the original stream.
These bytes will be replayed before any remaining stream data when
this body is polled. Returns None if no bytes were buffered.
Sourcepub fn into_parts(self) -> (Option<Bytes>, Remaining<B>)
pub fn into_parts(self) -> (Option<Bytes>, Remaining<B>)
Separates the buffered prefix from the remaining stream for independent handling.
Use this when you need to process the prefix and remaining data differently, such as forwarding them to separate destinations.
Trait Implementations§
Source§impl<B: HttpBody> Body for PartialBufferedBody<B>
impl<B: HttpBody> Body for PartialBufferedBody<B>
Source§fn poll_frame(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>>
fn poll_frame( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>>
Source§fn size_hint(&self) -> SizeHint
fn size_hint(&self) -> SizeHint
Source§fn is_end_stream(&self) -> bool
fn is_end_stream(&self) -> bool
true when the end of stream has been reached. Read moreimpl<'pin, B> Unpin for PartialBufferedBody<B>
Auto Trait Implementations§
impl<B> !Freeze for PartialBufferedBody<B>
impl<B> RefUnwindSafe for PartialBufferedBody<B>
impl<B> Send for PartialBufferedBody<B>
impl<B> Sync for PartialBufferedBody<B>
impl<B> UnwindSafe for PartialBufferedBody<B>
Blanket Implementations§
Source§impl<T> BodyExt for T
impl<T> BodyExt for T
Source§fn frame(&mut self) -> Frame<'_, Self>where
Self: Unpin,
fn frame(&mut self) -> Frame<'_, Self>where
Self: Unpin,
Frame, if any.Source§fn map_frame<F, B>(self, f: F) -> MapFrame<Self, F>
fn map_frame<F, B>(self, f: F) -> MapFrame<Self, F>
Source§fn map_err<F, E>(self, f: F) -> MapErr<Self, F>
fn map_err<F, E>(self, f: F) -> MapErr<Self, F>
Source§fn boxed_unsync(self) -> UnsyncBoxBody<Self::Data, Self::Error>
fn boxed_unsync(self) -> UnsyncBoxBody<Self::Data, Self::Error>
Source§fn collect(self) -> Collect<Self>where
Self: Sized,
fn collect(self) -> Collect<Self>where
Self: Sized,
Collected body which will collect all the DATA frames
and trailers.Source§fn with_trailers<F>(self, trailers: F) -> WithTrailers<Self, F>
fn with_trailers<F>(self, trailers: F) -> WithTrailers<Self, F>
Source§fn into_data_stream(self) -> BodyDataStream<Self>where
Self: Sized,
fn into_data_stream(self) -> BodyDataStream<Self>where
Self: Sized,
BodyDataStream.