pub struct TimeoutBody<B> { /* private fields */ }Expand description
Middleware that applies a timeout to request and response bodies.
Wrapper around a Body to time out if data is not ready within the specified duration.
The timeout is enforced between consecutive Frame polls, and it
resets after each poll.
The total time to produce a Body could exceed the timeout duration without
timing out, as long as no single interval between polls exceeds the timeout.
If the Body does not produce a requested data frame within the timeout period, it will return a TimeoutError.
§Differences from Timeout
Timeout applies a timeout to the request future, not body.
That timeout is not reset when bytes are handled, whether the request is active or not.
Bodies are handled asynchronously outside of the tower stack’s future and thus needs an additional timeout.
§Example
use http::{Request, Response};
use bytes::Bytes;
use http_body_util::Full;
use std::time::Duration;
use tower::ServiceBuilder;
use tower_http::timeout::RequestBodyTimeoutLayer;
async fn handle(_: Request<Full<Bytes>>) -> Result<Response<Full<Bytes>>, std::convert::Infallible> {
    // ...
}
let svc = ServiceBuilder::new()
    // Timeout bodies after 30 seconds of inactivity
    .layer(RequestBodyTimeoutLayer::new(Duration::from_secs(30)))
    .service_fn(handle);Implementations§
Source§impl<B> TimeoutBody<B>
 
impl<B> TimeoutBody<B>
Sourcepub fn new(timeout: Duration, body: B) -> TimeoutBody<B>
 
pub fn new(timeout: Duration, body: B) -> TimeoutBody<B>
Creates a new TimeoutBody.
Trait Implementations§
Source§impl<B> Body for TimeoutBody<B>
 
impl<B> Body for TimeoutBody<B>
Source§fn poll_frame(
    self: Pin<&mut TimeoutBody<B>>,
    cx: &mut Context<'_>,
) -> Poll<Option<Result<Frame<<TimeoutBody<B> as Body>::Data>, <TimeoutBody<B> as Body>::Error>>>
 
fn poll_frame( self: Pin<&mut TimeoutBody<B>>, cx: &mut Context<'_>, ) -> Poll<Option<Result<Frame<<TimeoutBody<B> as Body>::Data>, <TimeoutBody<B> as Body>::Error>>>
Source§fn is_end_stream(&self) -> bool
 
fn is_end_stream(&self) -> bool
true when the end of stream has been reached. Read moreimpl<'__pin, B> Unpin for TimeoutBody<B>where
    <PinnedFieldsOfHelperStruct<__Origin<'__pin, B>> as PinnedFieldsOfHelperTrait>::Actual: Unpin,
Auto Trait Implementations§
impl<B> !Freeze for TimeoutBody<B>
impl<B> !RefUnwindSafe for TimeoutBody<B>
impl<B> Send for TimeoutBody<B>where
    B: Send,
impl<B> Sync for TimeoutBody<B>where
    B: Sync,
impl<B> !UnwindSafe for TimeoutBody<B>
Blanket Implementations§
Source§impl<T> BodyExt for T
 
impl<T> BodyExt for T
Source§fn frame(&mut self) -> Frame<'_, Self>where
    Self: Unpin,
 
fn frame(&mut self) -> Frame<'_, Self>where
    Self: Unpin,
Frame, if any.Source§fn map_frame<F, B>(self, f: F) -> MapFrame<Self, F>
 
fn map_frame<F, B>(self, f: F) -> MapFrame<Self, F>
Source§fn map_err<F, E>(self, f: F) -> MapErr<Self, F>
 
fn map_err<F, E>(self, f: F) -> MapErr<Self, F>
Source§fn boxed_unsync(self) -> UnsyncBoxBody<Self::Data, Self::Error>
 
fn boxed_unsync(self) -> UnsyncBoxBody<Self::Data, Self::Error>
Source§fn collect(self) -> Collect<Self>where
    Self: Sized,
 
fn collect(self) -> Collect<Self>where
    Self: Sized,
Collected body which will collect all the DATA frames
and trailers.Source§fn with_trailers<F>(self, trailers: F) -> WithTrailers<Self, F>
 
fn with_trailers<F>(self, trailers: F) -> WithTrailers<Self, F>
Source§fn into_data_stream(self) -> BodyDataStream<Self>where
    Self: Sized,
 
fn into_data_stream(self) -> BodyDataStream<Self>where
    Self: Sized,
BodyDataStream.Source§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> 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> PolicyExt for Twhere
    T: ?Sized,
 
impl<T> PolicyExt for Twhere
    T: ?Sized,
Source§impl<T> ServiceExt for T
 
impl<T> ServiceExt for T
Source§fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>where
    Self: Sized,
 
fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>where
    Self: Sized,
Source§fn add_extension<T>(self, value: T) -> AddExtension<Self, T>where
    Self: Sized,
 
fn add_extension<T>(self, value: T) -> AddExtension<Self, T>where
    Self: Sized,
Source§fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>where
    Self: Sized,
 
fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>where
    Self: Sized,
Source§fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
    Self: Sized,
 
fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
    Self: Sized,
Source§fn compression(self) -> Compression<Self>where
    Self: Sized,
 
fn compression(self) -> Compression<Self>where
    Self: Sized,
Source§fn decompression(self) -> Decompression<Self>where
    Self: Sized,
 
fn decompression(self) -> Decompression<Self>where
    Self: Sized,
Source§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
    Self: Sized,
 
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
    Self: Sized,
Source§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
    Self: Sized,
 
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
    Self: Sized,
Source§fn follow_redirects(self) -> FollowRedirect<Self>where
    Self: Sized,
 
fn follow_redirects(self) -> FollowRedirect<Self>where
    Self: Sized,
Source§fn sensitive_headers(
    self,
    headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>where
    Self: Sized,
 
fn sensitive_headers(
    self,
    headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>where
    Self: Sized,
Source§fn sensitive_request_headers(
    self,
    headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<Self>where
    Self: Sized,
 
fn sensitive_request_headers(
    self,
    headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<Self>where
    Self: Sized,
Source§fn sensitive_response_headers(
    self,
    headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveResponseHeaders<Self>where
    Self: Sized,
 
fn sensitive_response_headers(
    self,
    headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveResponseHeaders<Self>where
    Self: Sized,
Source§fn override_request_header<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetRequestHeader<Self, M>where
    Self: Sized,
 
fn override_request_header<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetRequestHeader<Self, M>where
    Self: Sized,
Source§fn append_request_header<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetRequestHeader<Self, M>where
    Self: Sized,
 
fn append_request_header<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetRequestHeader<Self, M>where
    Self: Sized,
Source§fn insert_request_header_if_not_present<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetRequestHeader<Self, M>where
    Self: Sized,
 
fn insert_request_header_if_not_present<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetRequestHeader<Self, M>where
    Self: Sized,
Source§fn override_response_header<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetResponseHeader<Self, M>where
    Self: Sized,
 
fn override_response_header<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetResponseHeader<Self, M>where
    Self: Sized,
Source§fn append_response_header<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetResponseHeader<Self, M>where
    Self: Sized,
 
fn append_response_header<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetResponseHeader<Self, M>where
    Self: Sized,
Source§fn insert_response_header_if_not_present<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetResponseHeader<Self, M>where
    Self: Sized,
 
fn insert_response_header_if_not_present<M>(
    self,
    header_name: HeaderName,
    make: M,
) -> SetResponseHeader<Self, M>where
    Self: Sized,
Source§fn set_request_id<M>(
    self,
    header_name: HeaderName,
    make_request_id: M,
) -> SetRequestId<Self, M>where
    Self: Sized,
    M: MakeRequestId,
 
fn set_request_id<M>(
    self,
    header_name: HeaderName,
    make_request_id: M,
) -> SetRequestId<Self, M>where
    Self: Sized,
    M: MakeRequestId,
Source§fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
    Self: Sized,
    M: MakeRequestId,
 
fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
    Self: Sized,
    M: MakeRequestId,
x-request-id as the header name. Read moreSource§fn propagate_request_id(
    self,
    header_name: HeaderName,
) -> PropagateRequestId<Self>where
    Self: Sized,
 
fn propagate_request_id(
    self,
    header_name: HeaderName,
) -> PropagateRequestId<Self>where
    Self: Sized,
Source§fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
    Self: Sized,
 
fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
    Self: Sized,
x-request-id as the header name. Read moreSource§fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
    Self: Sized,
 
fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
    Self: Sized,
500 Internal Server responses. Read moreSource§fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
    Self: Sized,
 
fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
    Self: Sized,
413 Payload Too Large responses. Read more