Module tower_http::map_request_body [−][src]
This is supported on crate feature
map-request-body
only.Expand description
Apply a transformation to the request body.
Example
use bytes::Bytes; use http::{Request, Response}; use hyper::Body; use std::convert::Infallible; use std::{pin::Pin, task::{Context, Poll}}; use tower::{ServiceBuilder, service_fn, ServiceExt, Service}; use tower_http::map_request_body::MapRequestBodyLayer; use futures::ready; // A wrapper for a `hyper::Body` that prints the size of data chunks struct PrintChunkSizesBody { inner: Body, } impl PrintChunkSizesBody { fn new(inner: Body) -> Self { Self { inner } } } impl http_body::Body for PrintChunkSizesBody { type Data = Bytes; type Error = hyper::Error; fn poll_data( mut self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Option<Result<Self::Data, Self::Error>>> { if let Some(chunk) = ready!(Pin::new(&mut self.inner).poll_data(cx)?) { println!("chunk size = {}", chunk.len()); Poll::Ready(Some(Ok(chunk))) } else { Poll::Ready(None) } } fn poll_trailers( mut self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Result<Option<hyper::HeaderMap>, Self::Error>> { Pin::new(&mut self.inner).poll_trailers(cx) } fn is_end_stream(&self) -> bool { self.inner.is_end_stream() } fn size_hint(&self) -> http_body::SizeHint { self.inner.size_hint() } } async fn handle<B>(_: Request<B>) -> Result<Response<Body>, Infallible> { // ... } let mut svc = ServiceBuilder::new() // Wrap response bodies in `PrintChunkSizesBody` .layer(MapRequestBodyLayer::new(PrintChunkSizesBody::new)) .service_fn(handle); // Call the service let request = Request::new(Body::empty()); svc.ready().await?.call(request).await?;
Structs
MapRequestBody | Apply a transformation to the request body. |
MapRequestBodyLayer | Apply a transformation to the request body. |