use super::{Decompression, service::DefaultDecompressionMatcher};
use crate::headers::encoding::AcceptEncoding;
use rama_core::Layer;
#[derive(Debug, Clone)]
pub struct DecompressionLayer<M = DefaultDecompressionMatcher> {
accept: AcceptEncoding,
insert_accept_encoding_header: bool,
tolerate_decode_errors: bool,
matcher: M,
}
impl<M: Default> Default for DecompressionLayer<M> {
fn default() -> Self {
Self {
accept: Default::default(),
insert_accept_encoding_header: true,
tolerate_decode_errors: false,
matcher: Default::default(),
}
}
}
impl<S, M> Layer<S> for DecompressionLayer<M>
where
M: Clone,
{
type Service = Decompression<S, M>;
fn layer(&self, service: S) -> Self::Service {
Decompression {
inner: service,
accept: self.accept,
insert_accept_encoding_header: self.insert_accept_encoding_header,
tolerate_decode_errors: self.tolerate_decode_errors,
matcher: self.matcher.clone(),
}
}
}
impl DecompressionLayer {
#[must_use]
pub fn new() -> Self {
Default::default()
}
}
impl<M> DecompressionLayer<M> {
rama_utils::macros::generate_set_and_with! {
pub fn insert_accept_encoding_header(mut self, insert: bool) -> Self {
self.insert_accept_encoding_header = insert;
self
}
}
pub fn with_matcher<T>(self, matcher: T) -> DecompressionLayer<T> {
DecompressionLayer {
accept: self.accept,
insert_accept_encoding_header: self.insert_accept_encoding_header,
tolerate_decode_errors: self.tolerate_decode_errors,
matcher,
}
}
rama_utils::macros::generate_set_and_with! {
pub fn tolerate_decode_errors(mut self, tolerate: bool) -> Self {
self.tolerate_decode_errors = tolerate;
self
}
}
rama_utils::macros::generate_set_and_with! {
pub fn gzip(mut self, enable: bool) -> Self {
self.accept.set_gzip(enable);
self
}
}
rama_utils::macros::generate_set_and_with! {
pub fn deflate(mut self, enable: bool) -> Self {
self.accept.set_deflate(enable);
self
}
}
rama_utils::macros::generate_set_and_with! {
pub fn br(mut self, enable: bool) -> Self {
self.accept.set_br(enable);
self
}
}
rama_utils::macros::generate_set_and_with! {
pub fn zstd(mut self, enable: bool) -> Self {
self.accept.set_zstd(enable);
self
}
}
}