pub struct Body { /* private fields */ }
Expand description
A streaming HTTP body.
Body
represents the HTTP body of both Request
and Response
. It’s completely
streaming, and implements AsyncBufRead
to make reading from it both convenient and
performant.
Both Request
and Response
take Body
by Into<Body>
, which means that passing string
literals, byte vectors, but also concrete Body
instances are all valid. This makes it
easy to create both quick HTTP requests, but also have fine grained control over how bodies
are streamed out.
§Examples
use http_types::{Body, Response, StatusCode};
use async_std::io::Cursor;
let mut req = Response::new(StatusCode::Ok);
req.set_body("Hello Chashu");
let mut req = Response::new(StatusCode::Ok);
let cursor = Cursor::new("Hello Nori");
let body = Body::from_reader(cursor, Some(10)); // set the body length
req.set_body(body);
§Length
One of the details of Body
to be aware of is the length
parameter. The value of
length
is used by HTTP implementations to determine how to treat the stream. If a length
is known ahead of time, it’s strongly recommended to pass it.
Casting from Vec<u8>
, String
, or similar to Body
will automatically set the value of
length
.
§Content Encoding
By default Body
will come with a fallback Mime type that is used by Request
and
Response
if no other type has been set, and no other Mime type can be inferred.
It’s strongly recommended to always set a mime type on both the Request
and Response
,
and not rely on the fallback mechanisms. However, they’re still there if you need them.
Implementations§
Source§impl Body
impl Body
Sourcepub fn empty() -> Self
pub fn empty() -> Self
Create a new empty Body
.
The body will have a length of 0
, and the Mime type set to application/octet-stream
if
no other mime type has been set or can be sniffed.
§Examples
use http_types::{Body, Response, StatusCode};
let mut req = Response::new(StatusCode::Ok);
req.set_body(Body::empty());
Sourcepub fn from_reader(
reader: impl AsyncBufRead + Unpin + Send + Sync + 'static,
len: Option<usize>,
) -> Self
pub fn from_reader( reader: impl AsyncBufRead + Unpin + Send + Sync + 'static, len: Option<usize>, ) -> Self
Create a Body
from a reader with an optional length.
The Mime type is set to application/octet-stream
if no other mime type has been set or can
be sniffed. If a Body
has no length, HTTP implementations will often switch over to
framed messages such as Chunked
Encoding.
§Examples
use http_types::{Body, Response, StatusCode};
use async_std::io::Cursor;
let mut req = Response::new(StatusCode::Ok);
let cursor = Cursor::new("Hello Nori");
let len = 10;
req.set_body(Body::from_reader(cursor, Some(len)));
Sourcepub fn into_reader(
self,
) -> Box<dyn AsyncBufRead + Unpin + Send + Sync + 'static>
pub fn into_reader( self, ) -> Box<dyn AsyncBufRead + Unpin + Send + Sync + 'static>
Get the inner reader from the Body
§Examples
use http_types::Body;
use async_std::io::Cursor;
let cursor = Cursor::new("Hello Nori");
let body = Body::from_reader(cursor, None);
let _ = body.into_reader();
Sourcepub fn from_bytes(bytes: Vec<u8>) -> Self
pub fn from_bytes(bytes: Vec<u8>) -> Self
Create a Body
from a Vec of bytes.
The Mime type is set to application/octet-stream
if no other mime type has been set or can
be sniffed. If a Body
has no length, HTTP implementations will often switch over to
framed messages such as Chunked
Encoding.
§Examples
use http_types::{Body, Response, StatusCode};
use async_std::io::Cursor;
let mut req = Response::new(StatusCode::Ok);
let input = vec![1, 2, 3];
req.set_body(Body::from_bytes(input));
Sourcepub async fn into_bytes(self) -> Result<Vec<u8>>
pub async fn into_bytes(self) -> Result<Vec<u8>>
Parse the body into a Vec<u8>
.
§Examples
use http_types::Body;
let bytes = vec![1, 2, 3];
let body = Body::from_bytes(bytes);
let bytes: Vec<u8> = body.into_bytes().await?;
assert_eq!(bytes, vec![1, 2, 3]);
Sourcepub fn from_string(s: String) -> Self
pub fn from_string(s: String) -> Self
Create a Body
from a String
The Mime type is set to text/plain
if no other mime type has been set or can
be sniffed. If a Body
has no length, HTTP implementations will often switch over to
framed messages such as Chunked
Encoding.
§Examples
use http_types::{Body, Response, StatusCode};
use async_std::io::Cursor;
let mut req = Response::new(StatusCode::Ok);
let input = String::from("hello Nori!");
req.set_body(Body::from_string(input));
Sourcepub async fn into_string(self) -> Result<String>
pub async fn into_string(self) -> Result<String>
Read the body as a string
§Examples
use http_types::Body;
use async_std::io::Cursor;
let cursor = Cursor::new("Hello Nori");
let body = Body::from_reader(cursor, None);
assert_eq!(&body.into_string().await.unwrap(), "Hello Nori");
Sourcepub async fn into_json<T: DeserializeOwned>(self) -> Result<T>
pub async fn into_json<T: DeserializeOwned>(self) -> Result<T>
Parse the body as JSON, serializing it to a struct.
§Examples
use http_types::Body;
use http_types::convert::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]
struct Cat { name: String }
let cat = Cat { name: String::from("chashu") };
let body = Body::from_json(&cat)?;
let cat: Cat = body.into_json().await?;
assert_eq!(&cat.name, "chashu");
Sourcepub fn from_form(form: &impl Serialize) -> Result<Self>
pub fn from_form(form: &impl Serialize) -> Result<Self>
Creates a Body
from a type, serializing it using form encoding.
§Mime
The encoding is set to application/x-www-form-urlencoded
.
§Errors
An error will be returned if the encoding failed.
§Examples
use http_types::Body;
use http_types::convert::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]
struct Cat { name: String }
let cat = Cat { name: String::from("chashu") };
let body = Body::from_form(&cat)?;
let cat: Cat = body.into_form().await?;
assert_eq!(&cat.name, "chashu");
Sourcepub async fn into_form<T: DeserializeOwned>(self) -> Result<T>
pub async fn into_form<T: DeserializeOwned>(self) -> Result<T>
Parse the body from form encoding into a type.
§Errors
An error is returned if the underlying IO stream errors, or if the body could not be deserialized into the type.
§Examples
use http_types::Body;
use http_types::convert::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]
struct Cat { name: String }
let cat = Cat { name: String::from("chashu") };
let body = Body::from_form(&cat)?;
let cat: Cat = body.into_form().await?;
assert_eq!(&cat.name, "chashu");
Sourcepub async fn from_file<P>(path: P) -> Result<Self>
pub async fn from_file<P>(path: P) -> Result<Self>
Create a Body
from a file.
The Mime type set to application/octet-stream
if no other mime type has
been set or can be sniffed.
§Examples
use http_types::{Body, Response, StatusCode};
let mut res = Response::new(StatusCode::Ok);
res.set_body(Body::from_file("/path/to/file").await?);
Sourcepub fn len(&self) -> Option<usize>
pub fn len(&self) -> Option<usize>
Get the length of the body in bytes.
§Examples
use http_types::Body;
use async_std::io::Cursor;
let cursor = Cursor::new("Hello Nori");
let len = 10;
let body = Body::from_reader(cursor, Some(len));
assert_eq!(body.len(), Some(10));
Sourcepub fn is_empty(&self) -> Option<bool>
pub fn is_empty(&self) -> Option<bool>
Returns true
if the body has a length of zero, and false
otherwise.
Sourcepub fn chain(self, other: Body) -> Self
pub fn chain(self, other: Body) -> Self
Create a Body by chaining another Body after this one, consuming both.
If both Body instances have a length, and their sum does not overflow, the resulting Body will have a length.
If both Body instances have the same fallback MIME type, the resulting
Body will have the same fallback MIME type; otherwise, the resulting
Body will have the fallback MIME type application/octet-stream
.
§Examples
use http_types::Body;
use async_std::io::Cursor;
let cursor = Cursor::new("Hello ");
let body = Body::from_reader(cursor, None).chain(Body::from("Nori"));
assert_eq!(&body.into_string().await.unwrap(), "Hello Nori");
Trait Implementations§
Source§impl AsyncBufRead for Body
impl AsyncBufRead for Body
Source§impl AsyncRead for Body
impl AsyncRead for Body
impl<'__pin> Unpin for Bodywhere
PinnedFieldsOf<__Origin<'__pin>>: Unpin,
Auto Trait Implementations§
impl Freeze for Body
impl !RefUnwindSafe for Body
impl Send for Body
impl Sync for Body
impl !UnwindSafe for Body
Blanket Implementations§
Source§impl<R> AsyncBufReadExt for Rwhere
R: AsyncBufRead + ?Sized,
impl<R> AsyncBufReadExt for Rwhere
R: AsyncBufRead + ?Sized,
Source§fn fill_buf(&mut self) -> FillBuf<'_, Self>where
Self: Unpin,
fn fill_buf(&mut self) -> FillBuf<'_, Self>where
Self: Unpin,
Source§fn read_until<'a>(
&'a mut self,
byte: u8,
buf: &'a mut Vec<u8>,
) -> ReadUntilFuture<'a, Self>where
Self: Unpin,
fn read_until<'a>(
&'a mut self,
byte: u8,
buf: &'a mut Vec<u8>,
) -> ReadUntilFuture<'a, Self>where
Self: Unpin,
Source§fn read_line<'a>(&'a mut self, buf: &'a mut String) -> ReadLineFuture<'a, Self>where
Self: Unpin,
fn read_line<'a>(&'a mut self, buf: &'a mut String) -> ReadLineFuture<'a, Self>where
Self: Unpin,
buf
until a newline (the 0xA byte) or EOF is found. Read moreSource§impl<R> AsyncBufReadExt for Rwhere
R: AsyncBufRead + ?Sized,
impl<R> AsyncBufReadExt for Rwhere
R: AsyncBufRead + ?Sized,
Source§fn fill_buf(&mut self) -> FillBuf<'_, Self>where
Self: Unpin,
fn fill_buf(&mut self) -> FillBuf<'_, Self>where
Self: Unpin,
Source§fn read_until<'a>(
&'a mut self,
byte: u8,
buf: &'a mut Vec<u8>,
) -> ReadUntilFuture<'a, Self>where
Self: Unpin,
fn read_until<'a>(
&'a mut self,
byte: u8,
buf: &'a mut Vec<u8>,
) -> ReadUntilFuture<'a, Self>where
Self: Unpin,
Source§fn read_line<'a>(&'a mut self, buf: &'a mut String) -> ReadLineFuture<'a, Self>where
Self: Unpin,
fn read_line<'a>(&'a mut self, buf: &'a mut String) -> ReadLineFuture<'a, Self>where
Self: Unpin,
buf
until a newline (the 0xA byte) or EOF is found. Read moreSource§impl<R> AsyncReadExt for R
impl<R> AsyncReadExt for R
Source§fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadFuture<'a, Self>where
Self: Unpin,
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadFuture<'a, Self>where
Self: Unpin,
Source§fn read_vectored<'a>(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>],
) -> ReadVectoredFuture<'a, Self>where
Self: Unpin,
fn read_vectored<'a>(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>],
) -> ReadVectoredFuture<'a, Self>where
Self: Unpin,
Source§fn read_to_end<'a>(
&'a mut self,
buf: &'a mut Vec<u8>,
) -> ReadToEndFuture<'a, Self>where
Self: Unpin,
fn read_to_end<'a>(
&'a mut self,
buf: &'a mut Vec<u8>,
) -> ReadToEndFuture<'a, Self>where
Self: Unpin,
Source§fn read_to_string<'a>(
&'a mut self,
buf: &'a mut String,
) -> ReadToStringFuture<'a, Self>where
Self: Unpin,
fn read_to_string<'a>(
&'a mut self,
buf: &'a mut String,
) -> ReadToStringFuture<'a, Self>where
Self: Unpin,
Source§fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExactFuture<'a, Self>where
Self: Unpin,
fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExactFuture<'a, Self>where
Self: Unpin,
buf
. Read moreSource§fn take(self, limit: u64) -> Take<Self>where
Self: Sized,
fn take(self, limit: u64) -> Take<Self>where
Self: Sized,
limit
bytes from it. Read moreSource§impl<R> AsyncReadExt for R
impl<R> AsyncReadExt for R
Source§fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadFuture<'a, Self>where
Self: Unpin,
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadFuture<'a, Self>where
Self: Unpin,
Source§fn read_vectored<'a>(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>],
) -> ReadVectoredFuture<'a, Self>where
Self: Unpin,
fn read_vectored<'a>(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>],
) -> ReadVectoredFuture<'a, Self>where
Self: Unpin,
Source§fn read_to_end<'a>(
&'a mut self,
buf: &'a mut Vec<u8>,
) -> ReadToEndFuture<'a, Self>where
Self: Unpin,
fn read_to_end<'a>(
&'a mut self,
buf: &'a mut Vec<u8>,
) -> ReadToEndFuture<'a, Self>where
Self: Unpin,
Source§fn read_to_string<'a>(
&'a mut self,
buf: &'a mut String,
) -> ReadToStringFuture<'a, Self>where
Self: Unpin,
fn read_to_string<'a>(
&'a mut self,
buf: &'a mut String,
) -> ReadToStringFuture<'a, Self>where
Self: Unpin,
Source§fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExactFuture<'a, Self>where
Self: Unpin,
fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExactFuture<'a, Self>where
Self: Unpin,
buf
. Read moreSource§fn take(self, limit: u64) -> Take<Self>where
Self: Sized,
fn take(self, limit: u64) -> Take<Self>where
Self: Sized,
limit
bytes from it. Read moreSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> BufReadExt for Twhere
T: AsyncBufRead + ?Sized,
impl<T> BufReadExt for Twhere
T: AsyncBufRead + ?Sized,
Source§fn read_until<'a>(
&'a mut self,
byte: u8,
buf: &'a mut Vec<u8>,
) -> ReadUntilFuture<'a, Self>where
Self: Unpin,
fn read_until<'a>(
&'a mut self,
byte: u8,
buf: &'a mut Vec<u8>,
) -> ReadUntilFuture<'a, Self>where
Self: Unpin,
Source§fn read_line<'a>(&'a mut self, buf: &'a mut String) -> ReadLineFuture<'a, Self>where
Self: Unpin,
fn read_line<'a>(&'a mut self, buf: &'a mut String) -> ReadLineFuture<'a, Self>where
Self: Unpin,
buf
until a newline (the 0xA byte) is
reached. Read moreSource§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> ReadExt for T
impl<T> ReadExt for T
Source§fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadFuture<'a, Self>where
Self: Unpin,
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadFuture<'a, Self>where
Self: Unpin,
Source§fn read_vectored<'a>(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>],
) -> ReadVectoredFuture<'a, Self>where
Self: Unpin,
fn read_vectored<'a>(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>],
) -> ReadVectoredFuture<'a, Self>where
Self: Unpin,
Source§fn read_to_end<'a>(
&'a mut self,
buf: &'a mut Vec<u8>,
) -> ReadToEndFuture<'a, Self>where
Self: Unpin,
fn read_to_end<'a>(
&'a mut self,
buf: &'a mut Vec<u8>,
) -> ReadToEndFuture<'a, Self>where
Self: Unpin,
Source§fn read_to_string<'a>(
&'a mut self,
buf: &'a mut String,
) -> ReadToStringFuture<'a, Self>where
Self: Unpin,
fn read_to_string<'a>(
&'a mut self,
buf: &'a mut String,
) -> ReadToStringFuture<'a, Self>where
Self: Unpin,
Source§fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExactFuture<'a, Self>where
Self: Unpin,
fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExactFuture<'a, Self>where
Self: Unpin,
buf
. Read moreSource§fn take(self, limit: u64) -> Take<Self>where
Self: Sized,
fn take(self, limit: u64) -> Take<Self>where
Self: Sized,
limit
bytes from it. Read moreSource§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read
. Read more