useself::combinators::{BoxBody, MapData, MapErr, UnsyncBoxBody}; use bytes::{Buf, Bytes}; use http::HeaderMap; use std::convert::Infallible; use std::ops; use std::pin::Pin; use std::task::{Context, Poll};
/// Trait representing a streaming body of a Request or Response. /// /// Data is streamed via the `poll_data` function, which asynchronously yields `T: Buf` values. The /// `size_hint` function provides insight into the total number of bytes that will be streamed. /// /// The `poll_trailers` function returns an optional set of trailers used to finalize the request / /// response exchange. This is mostly used when using the HTTP/2.0 protocol. /// pubtrait Body { /// Values yielded by the `Body`. type Data: Buf;
/// The error type this `Body` might generate. type Error;
/// Attempt to pull out the next data buffer of this stream. fn poll_data( self: Pin<&mutSelf>,
cx: &mut Context<'_>,
) -> Poll<Option<Result<Self::Data, Self::Error>>>;
/// Poll for an optional **single** `HeaderMap` of trailers. /// /// This function should only be called once `poll_data` returns `None`. fn poll_trailers( self: Pin<&mutSelf>,
cx: &mut Context<'_>,
) -> Poll<Result<Option<HeaderMap>, Self::Error>>;
/// Returns `true` when the end of stream has been reached. /// /// An end of stream means that both `poll_data` and `poll_trailers` will /// return `None`. /// /// A return value of `false` **does not** guarantee that a value will be /// returned from `poll_stream` or `poll_trailers`. fn is_end_stream(&self) -> bool { false
}
/// Returns the bounds on the remaining length of the stream. /// /// When the **exact** remaining length of the stream is known, the upper bound will be set and /// will equal the lower bound. fn size_hint(&self) -> SizeHint {
SizeHint::default()
}
/// Returns future that resolves to next data chunk, if any. fn data(&mutself) -> Data<'_, Self> where Self: Unpin + Sized,
{
Data(self)
}
/// Returns future that resolves to trailers, if any. fn trailers(&mutself) -> Trailers<'_, Self> where Self: Unpin + Sized,
{
Trailers(self)
}
/// Maps this body's data value to a different value. fn map_data<F, B>(self, f: F) -> MapData<Self, F> where Self: Sized,
F: FnMut(Self::Data) -> B,
B: Buf,
{
MapData::new(self, f)
}
/// Maps this body's error value to a different value. fn map_err<F, E>(self, f: F) -> MapErr<Self, F> where Self: Sized,
F: FnMut(Self::Error) -> E,
{
MapErr::new(self, f)
}
/// Turn this body into a boxed trait object. fn boxed(self) -> BoxBody<Self::Data, Self::Error> where Self: Sized + Send + Sync + 'static,
{
BoxBody::new(self)
}
/// Turn this body into a boxed trait object that is !Sync. fn boxed_unsync(self) -> UnsyncBoxBody<Self::Data, Self::Error> where Self: Sized + Send + 'static,
{
UnsyncBoxBody::new(self)
}
}
impl<T: Body + Unpin + ?Sized> Body for &mut T { type Data = T::Data; type Error = T::Error;
impl<P> Body for Pin<P> where
P: Unpin + ops::DerefMut,
P::Target: Body,
{ type Data = <<P as ops::Deref>::Target as Body>::Data; type Error = <<P as ops::Deref>::Target as Body>::Error;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.