Skip to main content

PartialBufferedBody

Struct PartialBufferedBody 

Source
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:

  1. Yields the buffered prefix (if any) as a single frame
  2. 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,

Source

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.

Source

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.

Source

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>

Source§

type Data = Bytes

Values yielded by the Body.
Source§

type Error = <B as Body>::Error

The error type this Body might generate.
Source§

fn poll_frame( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>>

Attempt to pull out the next data buffer of this stream.
Source§

fn size_hint(&self) -> SizeHint

Returns the bounds on the remaining length of the stream. Read more
Source§

fn is_end_stream(&self) -> bool

Returns true when the end of stream has been reached. Read more
Source§

impl<'pin, B> Unpin for PartialBufferedBody<B>
where B: HttpBody, PinnedFieldsOf<__PartialBufferedBody<'pin, B>>: Unpin,

Auto Trait Implementations§

§

impl<B> !Freeze for PartialBufferedBody<B>

§

impl<B> RefUnwindSafe for PartialBufferedBody<B>

§

impl<B> Send for PartialBufferedBody<B>
where B: Send, <B as Body>::Error: Send,

§

impl<B> Sync for PartialBufferedBody<B>
where B: Sync, <B as Body>::Error: Sync,

§

impl<B> UnwindSafe for PartialBufferedBody<B>
where B: UnwindSafe, <B as Body>::Error: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> BodyExt for T
where T: Body + ?Sized,

Source§

fn frame(&mut self) -> Frame<'_, Self>
where Self: Unpin,

Returns a future that resolves to the next Frame, if any.
Source§

fn map_frame<F, B>(self, f: F) -> MapFrame<Self, F>
where Self: Sized, F: FnMut(Frame<Self::Data>) -> Frame<B>, B: Buf,

Maps this body’s frame to a different kind.
Source§

fn map_err<F, E>(self, f: F) -> MapErr<Self, F>
where Self: Sized, F: FnMut(Self::Error) -> E,

Maps this body’s error value to a different value.
Source§

fn boxed(self) -> BoxBody<Self::Data, Self::Error>
where Self: Sized + Send + Sync + 'static,

Turn this body into a boxed trait object.
Source§

fn boxed_unsync(self) -> UnsyncBoxBody<Self::Data, Self::Error>
where Self: Sized + Send + 'static,

Turn this body into a boxed trait object that is !Sync.
Source§

fn collect(self) -> Collect<Self>
where Self: Sized,

Turn this body into Collected body which will collect all the DATA frames and trailers.
Source§

fn with_trailers<F>(self, trailers: F) -> WithTrailers<Self, F>
where Self: Sized, F: Future<Output = Option<Result<HeaderMap, Self::Error>>>,

Add trailers to the body. Read more
Source§

fn into_data_stream(self) -> BodyDataStream<Self>
where Self: Sized,

Turn this body into BodyDataStream.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more