Skip to main content

ReceivedBody

Struct ReceivedBody 

Source
pub struct ReceivedBody<'conn, Transport> { /* private fields */ }
Expand description

A received http body

This type represents a body that will be read from the underlying transport, which it may either borrow from a Conn or own.

let app = HttpTest::new(|mut conn| async move {
    let body = conn.request_body();
    let body_string = body.read_string().await.unwrap();
    conn.with_response_body(format!("received: {body_string}"))
});

app.get("/").block().assert_body("received: ");
app.post("/")
    .with_body("hello")
    .block()
    .assert_body("received: hello");

§Bounds checking

Every ReceivedBody has a maximum length beyond which it will return an error, expressed as a u64. To override this on the specific ReceivedBody, use ReceivedBody::with_max_len or ReceivedBody::set_max_len

The default maximum length is 10mb; see HttpConfig::received_body_max_len to configure this server-wide.

§Large chunks, small read buffers

Attempting to read a chunked body with a buffer that is shorter than the chunk size in hex will result in an error.

Implementations§

Source§

impl<'conn, Transport> ReceivedBody<'conn, Transport>

Source

pub fn content_length(&self) -> Option<u64>

Returns a copy of The content-length of this body, if available. This usually is derived from the content-length header. If the http request or response that this body is attached to uses transfer-encoding chunked, this will be None.

HttpTest::new(|mut conn| async move {
let body = conn.request_body();
assert_eq!(body.content_length(), Some(5));
let body_string = body.read_string().await.unwrap();
conn.with_status(200)
.with_response_body(format!("received: {body_string}"))
})
.post("/")
.with_body("hello")
.block()
.assert_ok()
.assert_body("received: hello");
Source

pub fn encoding(&self) -> &'static Encoding

Borrows the character encoding of this body, usually determined from the content type (mime-type) of the associated Conn.

Source

pub fn max_len(&self) -> u64

Returns a copy of The maximum length that can be read from this body before error

See also HttpConfig::received_body_max_len

Source

pub fn set_max_len(&mut self, max_len: u64) -> &mut Self

Sets The maximum length that can be read from this body before error, returning &mut Self for chaining

See also HttpConfig::received_body_max_len

Source

pub fn with_max_len(self, max_len: u64) -> Self

Owned chainable setter for The maximum length that can be read from this body before error, returning Self

See also HttpConfig::received_body_max_len

Source

pub fn initial_len(&self) -> usize

Returns a copy of The initial buffer capacity allocated when reading the body to bytes or a string

See HttpConfig::received_body_initial_len

Source

pub fn set_initial_len(&mut self, initial_len: usize) -> &mut Self

Sets The initial buffer capacity allocated when reading the body to bytes or a string, returning &mut Self for chaining

See HttpConfig::received_body_initial_len

Source

pub fn with_initial_len(self, initial_len: usize) -> Self

Owned chainable setter for The initial buffer capacity allocated when reading the body to bytes or a string, returning Self

See HttpConfig::received_body_initial_len

Source

pub fn copy_loops_per_yield(&self) -> usize

Returns a copy of The maximum number of read loops that reading this received body will perform before yielding back to the runtime

See HttpConfig::copy_loops_per_yield

Source

pub fn set_copy_loops_per_yield( &mut self, copy_loops_per_yield: usize, ) -> &mut Self

Sets The maximum number of read loops that reading this received body will perform before, returning &mut Self for chaining yielding back to the runtime

See HttpConfig::copy_loops_per_yield

Source

pub fn with_copy_loops_per_yield(self, copy_loops_per_yield: usize) -> Self

Owned chainable setter for The maximum number of read loops that reading this received body will perform before, returning Self yielding back to the runtime

See HttpConfig::copy_loops_per_yield

Source

pub fn max_preallocate(&self) -> usize

Returns a copy of Maximum size to pre-allocate based on content-length for buffering this received body

See HttpConfig::received_body_max_preallocate

Source

pub fn set_max_preallocate(&mut self, max_preallocate: usize) -> &mut Self

Sets Maximum size to pre-allocate based on content-length for buffering this received body, returning &mut Self for chaining

See HttpConfig::received_body_max_preallocate

Source

pub fn with_max_preallocate(self, max_preallocate: usize) -> Self

Owned chainable setter for Maximum size to pre-allocate based on content-length for buffering this received body, returning Self

See HttpConfig::received_body_max_preallocate

Source§

impl<'conn, Transport> ReceivedBody<'conn, Transport>
where Transport: AsyncRead + AsyncWrite + Unpin + Send + Sync + 'static,

Source

pub async fn read_string(self) -> Result<String>

§Reads entire body to String.

This uses the encoding determined by the content-type (mime) charset. If an encoding problem is encountered, the String returned by ReceivedBody::read_string will contain utf8 replacement characters.

Note that this can only be performed once per Conn, as the underlying data is not cached anywhere. This is the only copy of the body contents.

§Errors

This will return an error if there is an IO error on the underlying transport such as a disconnect

This will also return an error if the length exceeds the maximum length. To override this value on this specific body, use ReceivedBody::with_max_len or ReceivedBody::set_max_len

Source

pub async fn read_bytes(self) -> Result<Vec<u8>>

Similar to ReceivedBody::read_string, but returns the raw bytes. This is useful for bodies that are not text.

You can use this in conjunction with encoding if you need different handling of malformed character encoding than the lossy conversion provided by ReceivedBody::read_string.

§Errors

This will return an error if there is an IO error on the underlying transport such as a disconnect

This will also return an error if the length exceeds received_body_max_len. To override this value on this specific body, use ReceivedBody::with_max_len or ReceivedBody::set_max_len

Source

pub async fn drain(self) -> Result<u64>

Consumes the remainder of this body from the underlying transport by reading it to the end and discarding the contents. This is important for http1.1 keepalive, but most of the time you do not need to directly call this. It returns the number of bytes consumed.

§Errors

This will return an std::io::Result::Err if there is an io error on the underlying transport, such as a disconnect

Source§

impl<T> ReceivedBody<'static, T>

Source

pub fn take_transport(&mut self) -> Option<T>

takes the static transport from this received body

Trait Implementations§

Source§

impl<Transport> AsyncRead for ReceivedBody<'_, Transport>
where Transport: AsyncRead + AsyncWrite + Unpin + Send + Sync + 'static,

Source§

fn poll_read( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8], ) -> Poll<Result<usize>>

Attempt to read from the AsyncRead into buf. Read more
Source§

fn poll_read_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &mut [IoSliceMut<'_>], ) -> Poll<Result<usize, Error>>

Attempt to read from the AsyncRead into bufs using vectored IO operations. Read more
Source§

impl<Transport> Debug for ReceivedBody<'_, Transport>

Source§

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

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

impl<Transport> From<ReceivedBody<'static, Transport>> for Body
where Transport: AsyncRead + AsyncWrite + Send + Sync + Unpin + 'static,

Source§

fn from(rb: ReceivedBody<'static, Transport>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<'conn, Transport> Freeze for ReceivedBody<'conn, Transport>
where Transport: Freeze,

§

impl<'conn, Transport> !RefUnwindSafe for ReceivedBody<'conn, Transport>

§

impl<'conn, Transport> Send for ReceivedBody<'conn, Transport>
where Transport: Send,

§

impl<'conn, Transport> Sync for ReceivedBody<'conn, Transport>
where Transport: Sync,

§

impl<'conn, Transport> Unpin for ReceivedBody<'conn, Transport>
where Transport: Unpin,

§

impl<'conn, Transport> UnsafeUnpin for ReceivedBody<'conn, Transport>
where Transport: UnsafeUnpin,

§

impl<'conn, Transport> !UnwindSafe for ReceivedBody<'conn, Transport>

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<R> AsyncReadExt for R
where R: AsyncRead + ?Sized,

Source§

fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadFuture<'a, Self>
where Self: Unpin,

Reads some bytes from the byte stream. Read more
Source§

fn read_vectored<'a>( &'a mut self, bufs: &'a mut [IoSliceMut<'a>], ) -> ReadVectoredFuture<'a, Self>
where Self: Unpin,

Like read(), except it reads into a slice of buffers. Read more
Source§

fn read_to_end<'a>( &'a mut self, buf: &'a mut Vec<u8>, ) -> ReadToEndFuture<'a, Self>
where Self: Unpin,

Reads the entire contents and appends them to a Vec. Read more
Source§

fn read_to_string<'a>( &'a mut self, buf: &'a mut String, ) -> ReadToStringFuture<'a, Self>
where Self: Unpin,

Reads the entire contents and appends them to a String. Read more
Source§

fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExactFuture<'a, Self>
where Self: Unpin,

Reads the exact number of bytes required to fill buf. Read more
Source§

fn take(self, limit: u64) -> Take<Self>
where Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
Source§

fn bytes(self) -> Bytes<Self>
where Self: Sized,

Converts this AsyncRead into a Stream of bytes. Read more
Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where R: AsyncRead, Self: Sized,

Creates an adapter which will chain this stream with another. Read more
Source§

fn boxed_reader<'a>(self) -> Pin<Box<dyn AsyncRead + Send + 'a>>
where Self: Sized + Send + 'a,

Boxes the reader and changes its type to dyn AsyncRead + Send + 'a. 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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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, 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.