Struct BodyReader

Source
pub struct BodyReader<B> { /* private fields */ }
Expand description

Convenient wrapper for reading Body content from http::Response.

It is useful in the most common response body reading cases.

Implementations§

Source§

impl<B> BodyReader<B>

Source

pub async fn bytes(self) -> Result<Bytes, <B as Body>::Error>
where B: Body, <B as Body>::Data: Buf,

Reads the full response body as Bytes.

§Example
use http::Response;
use http_body_reader::ResponseExt as _;
use http_body_util::Full;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Create a new response with the given text as the body.
    let message = b"Hello world";
    let response = Response::builder().body(Full::new(message.as_ref()))?;
    // Read the response body as bytes and check that it matches the original message.
    assert_eq!(response.body_reader().bytes().await?, message.as_ref());

    Ok(())
}
Source

pub async fn utf8( self, ) -> Result<String, BodyReaderError<<B as Body>::Error, FromUtf8Error>>
where B: Body, <B as Body>::Data: Buf,

Reads the full response text.

§Note

The method will only attempt to decode the response as UTF-8, regardless of the Content-Type header.

§Errors

This method fails if the response body cannot be decoded as UTF-8.

§Example
use http::Response;
use http_body_reader::ResponseExt as _;
use http_body_util::Full;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Create a new response with the given text as the body.
    let message = "Hello world";
    let response = Response::builder().body(Full::new(message.as_ref()))?;
    // Read the response body as UTF-8 and check that it matches the original message.
    assert_eq!(response.body_reader().utf8().await?, message);

    Ok(())
}
Source

pub async fn json<T>( self, ) -> Result<T, BodyReaderError<<B as Body>::Error, Error>>
where T: DeserializeOwned, B: Body, <B as Body>::Data: Buf,

Deserializes the response body as JSON.

§Errors

This method fails whenever the response body is not valid JSON or it cannot be properly deserialized to the target type T.

§Examples
use http::Response;
use http_body_reader::ResponseExt as _;
use http_body_util::Full;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
struct SomeInfo {
    id: u32,
    name: String,
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let info = SomeInfo {
        id: 1234,
        name: "Alice".to_string(),
    };

    // Create a response with JSON body.
    let data = serde_json::to_vec(&info)?;
    let response = Response::builder().body(Full::new(data.as_ref()))?;
    // Read the response body as JSON and check that it matches the original info.
    assert_eq!(response.body_reader().json::<SomeInfo>().await?, info);

    Ok(())
}
Source

pub async fn form<T>( self, ) -> Result<T, BodyReaderError<<B as Body>::Error, Error>>
where T: DeserializeOwned, B: Body, <B as Body>::Data: Buf,

Deserializes the response body as form data.

§Errors

This method fails whenever the response body is not valid form data or it cannot be properly deserialized to the target type T.

§Examples
use http::Response;
use http_body_reader::ResponseExt as _;
use http_body_util::Full;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
struct SomeInfo {
    id: u32,
    name: String,
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let info = SomeInfo {
        id: 1234,
        name: "Alice".to_string(),
    };

    // Create a response with form data.
    let data = serde_urlencoded::to_string(&info)?;
    let response = Response::builder().body(Full::new(data.as_ref()))?;
    // Read the response body as form data and check that it matches the original info.
    assert_eq!(response.body_reader().form::<SomeInfo>().await?, info);

    Ok(())
}
Source

pub fn map<F, T>(self, f: F) -> BodyReader<T>
where F: FnOnce(B) -> T, T: Body, <T as Body>::Data: Buf,

Maps the body content using the provided function.

§Example
use http::Response;
use http_body_reader::ResponseExt as _;
use http_body_util::{Full, Limited};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Create a response with a body
    let response = Response::builder().body(Full::new("Lorem ipsum dolor sit amet".as_ref()))?;
    // Create a body reader with a limit of 8 bytes
    let body_reader = response.body_reader().map(|body| Limited::new(body, 8));
    // Make sure the body reader returns an error when the limit is exceeded.
    assert_eq!(
        body_reader.utf8().await.unwrap_err().to_string(),
        "length limit exceeded"
    );

    Ok(())
}

Trait Implementations§

Source§

impl<B> Clone for BodyReader<B>
where B: Clone,

Source§

fn clone(&self) -> BodyReader<B>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<B> Debug for BodyReader<B>
where B: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<B> From<Response<B>> for BodyReader<B>

Source§

fn from(response: Response<B>) -> BodyReader<B>

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<B> Freeze for BodyReader<B>
where B: Freeze,

§

impl<B> RefUnwindSafe for BodyReader<B>
where B: RefUnwindSafe,

§

impl<B> Send for BodyReader<B>
where B: Send,

§

impl<B> Sync for BodyReader<B>
where B: Sync,

§

impl<B> Unpin for BodyReader<B>
where B: Unpin,

§

impl<B> UnwindSafe for BodyReader<B>
where B: 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> 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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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
Source§

impl<T> ErasedDestructor for T
where T: 'static,