Struct Compression
pub struct Compression<S, P = DefaultPredicate> { /* private fields */ }Expand description
Compress response bodies of the underlying service.
This uses the Accept-Encoding header to pick an appropriate encoding and adds the
Content-Encoding header to responses.
See the module docs for more details.
Implementations§
§impl<S> Compression<S>
impl<S> Compression<S>
pub fn new(service: S) -> Compression<S>
pub fn new(service: S) -> Compression<S>
Creates a new Compression wrapping the service.
§impl<S, P> Compression<S, P>
impl<S, P> Compression<S, P>
pub fn into_inner(self) -> S
pub fn into_inner(self) -> S
Consumes self, returning the underlying service.
pub fn with_gzip(self, enable: bool) -> Compression<S, P>
pub fn with_gzip(self, enable: bool) -> Compression<S, P>
Sets whether to enable the gzip encoding.
pub fn set_gzip(&mut self, enable: bool) -> &mut Compression<S, P>
pub fn set_gzip(&mut self, enable: bool) -> &mut Compression<S, P>
Sets whether to enable the gzip encoding.
pub fn with_deflate(self, enable: bool) -> Compression<S, P>
pub fn with_deflate(self, enable: bool) -> Compression<S, P>
Sets whether to enable the Deflate encoding.
pub fn set_deflate(&mut self, enable: bool) -> &mut Compression<S, P>
pub fn set_deflate(&mut self, enable: bool) -> &mut Compression<S, P>
Sets whether to enable the Deflate encoding.
pub fn with_br(self, enable: bool) -> Compression<S, P>
pub fn with_br(self, enable: bool) -> Compression<S, P>
Sets whether to enable the Brotli encoding.
pub fn set_br(&mut self, enable: bool) -> &mut Compression<S, P>
pub fn set_br(&mut self, enable: bool) -> &mut Compression<S, P>
Sets whether to enable the Brotli encoding.
pub fn with_zstd(self, enable: bool) -> Compression<S, P>
pub fn with_zstd(self, enable: bool) -> Compression<S, P>
Sets whether to enable the Zstd encoding.
pub fn set_zstd(&mut self, enable: bool) -> &mut Compression<S, P>
pub fn set_zstd(&mut self, enable: bool) -> &mut Compression<S, P>
Sets whether to enable the Zstd encoding.
pub fn with_quality(self, quality: CompressionLevel) -> Compression<S, P>
pub fn with_quality(self, quality: CompressionLevel) -> Compression<S, P>
Sets the compression quality.
pub fn set_quality(
&mut self,
quality: CompressionLevel,
) -> &mut Compression<S, P>
pub fn set_quality( &mut self, quality: CompressionLevel, ) -> &mut Compression<S, P>
Sets the compression quality.
pub fn with_respect_content_encoding_if_possible(self) -> Compression<S, P>
pub fn with_respect_content_encoding_if_possible(self) -> Compression<S, P>
Allow responses with content-encoding.
Useful in case your stack uses that response header as preference. Not something you want for regular servers or proxies however, or most use cases for that matter.
pub fn set_respect_content_encoding_if_possible(
&mut self,
) -> &mut Compression<S, P>
pub fn set_respect_content_encoding_if_possible( &mut self, ) -> &mut Compression<S, P>
Allow responses with content-encoding.
Useful in case your stack uses that response header as preference. Not something you want for regular servers or proxies however, or most use cases for that matter.
pub fn with_compress_predicate<C>(self, predicate: C) -> Compression<S, C>where
C: Predicate,
pub fn with_compress_predicate<C>(self, predicate: C) -> Compression<S, C>where
C: Predicate,
Replace the current compression predicate.
Predicates are used to determine whether a response should be compressed or not.
The default predicate is DefaultPredicate. See its documentation for more
details on which responses it wont compress.
§Changing the compression predicate
use rama_utils::str::arcstr::arcstr;
use rama_http::layer::compression::{
Compression,
predicate::{Predicate, NotForContentType, DefaultPredicate},
};
use rama_core::service::service_fn;
// Placeholder service_fn
let service = service_fn(async |_: ()| {
Ok::<_, std::io::Error>(rama_http::Response::new(()))
});
// build our custom compression predicate
// its recommended to still include `DefaultPredicate` as part of
// custom predicates
let predicate = DefaultPredicate::new()
// don't compress responses who's `content-type` starts with `application/json`
.and(NotForContentType::new(arcstr!("application/json")));
let service = Compression::new(service).with_compress_predicate(predicate);See predicate for more utilities for building compression predicates.
Responses that are already compressed (ie have a content-encoding header) will never be
recompressed, regardless what they predicate says.
Trait Implementations§
§impl<S, P> Clone for Compression<S, P>
impl<S, P> Clone for Compression<S, P>
§fn clone(&self) -> Compression<S, P>
fn clone(&self) -> Compression<S, P>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl<S, P> Debug for Compression<S, P>
impl<S, P> Debug for Compression<S, P>
§impl<ReqBody, ResBody, S, P> Service<Request<ReqBody>> for Compression<S, P>
impl<ReqBody, ResBody, S, P> Service<Request<ReqBody>> for Compression<S, P>
§type Output = Response<CompressionBody<ResBody>>
type Output = Response<CompressionBody<ResBody>>
§async fn serve(
&self,
req: Request<ReqBody>,
) -> Result<<Compression<S, P> as Service<Request<ReqBody>>>::Output, <Compression<S, P> as Service<Request<ReqBody>>>::Error>
async fn serve( &self, req: Request<ReqBody>, ) -> Result<<Compression<S, P> as Service<Request<ReqBody>>>::Output, <Compression<S, P> as Service<Request<ReqBody>>>::Error>
§fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
Auto Trait Implementations§
impl<S, P> Freeze for Compression<S, P>
impl<S, P> RefUnwindSafe for Compression<S, P>where
S: RefUnwindSafe,
P: RefUnwindSafe,
impl<S, P> Send for Compression<S, P>
impl<S, P> Sync for Compression<S, P>
impl<S, P> Unpin for Compression<S, P>
impl<S, P> UnwindSafe for Compression<S, P>where
S: UnwindSafe,
P: UnwindSafe,
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
§impl<T, ReqBody, ResBody> GrpcService<ReqBody> for T
impl<T, ReqBody, ResBody> GrpcService<ReqBody> for T
§type ResponseBody = ResBody
type ResponseBody = ResBody
§fn serve(
&self,
request: Request<ReqBody>,
) -> impl Future<Output = Result<Response<<T as GrpcService<ReqBody>>::ResponseBody>, <T as GrpcService<ReqBody>>::Error>>
fn serve( &self, request: Request<ReqBody>, ) -> impl Future<Output = Result<Response<<T as GrpcService<ReqBody>>::ResponseBody>, <T as GrpcService<ReqBody>>::Error>>
§impl<S, Body> HttpClientExt for S
impl<S, Body> HttpClientExt for S
§type ExecuteResponse = Response<Body>
type ExecuteResponse = Response<Body>
execute method.§type ExecuteError = <S as Service<Request>>::Error
type ExecuteError = <S as Service<Request>>::Error
execute method.§fn get(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn get( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
GET request to a URL. Read more§fn post(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn post( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
POST request to a URL. Read more§fn put(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn put( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
PUT request to a URL. Read more§fn patch(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn patch( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
PATCH request to a URL. Read more§fn delete(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn delete( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
DELETE request to a URL. Read more§fn head(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn head( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
HEAD request to a URL. Read more§fn connect(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn connect( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
CONNECT request to a URL. Read more§fn request(
&self,
method: Method,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn request( &self, method: Method, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
§fn build_from_request<RequestBody>(
&self,
request: Request<RequestBody>,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn build_from_request<RequestBody>( &self, request: Request<RequestBody>, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
§fn execute(
&self,
request: Request,
) -> impl Future<Output = Result<<S as HttpClientExt>::ExecuteResponse, <S as HttpClientExt>::ExecuteError>>
fn execute( &self, request: Request, ) -> impl Future<Output = Result<<S as HttpClientExt>::ExecuteResponse, <S as HttpClientExt>::ExecuteError>>
Request. Read more§impl<S, Body> HttpClientWebSocketExt<Body> for S
impl<S, Body> HttpClientWebSocketExt<Body> for S
§fn websocket(
&self,
url: impl IntoUrl,
) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
fn websocket( &self, url: impl IntoUrl, ) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
WebSocketRequestBuilder] to be used to establish a WebSocket connection over http/1.1.§fn websocket_h2(
&self,
url: impl IntoUrl,
) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
fn websocket_h2( &self, url: impl IntoUrl, ) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
WebSocketRequestBuilder to be used to establish a WebSocket connection over h2.§fn websocket_with_request<RequestBody>(
&self,
req: Request<RequestBody>,
) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
fn websocket_with_request<RequestBody>( &self, req: Request<RequestBody>, ) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
WebSocketRequestBuilder starting from the given request. Read more§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<S, R> IntoEndpointService<(R,)> for S
impl<S, R> IntoEndpointService<(R,)> for S
type Service = MapResponseServie<S>
§fn into_endpoint_service(self) -> <S as IntoEndpointService<(R,)>>::Service
fn into_endpoint_service(self) -> <S as IntoEndpointService<(R,)>>::Service
rama_core::Service.§impl<S, R, State> IntoEndpointServiceWithState<(R,), State> for S
impl<S, R, State> IntoEndpointServiceWithState<(R,), State> for S
type Service = MapResponseServie<S>
§fn into_endpoint_service_with_state(
self,
_state: State,
) -> <S as IntoEndpointServiceWithState<(R,), State>>::Service
fn into_endpoint_service_with_state( self, _state: State, ) -> <S as IntoEndpointServiceWithState<(R,), State>>::Service
rama_core::Service with state.§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a rama_grpc::Request§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§fn and<P, B, E>(self, other: P) -> And<T, P>
fn and<P, B, E>(self, other: P) -> And<T, P>
Policy that returns Action::Follow only if self and other return
Action::Follow. Read more