pingora_core/modules/http/
compression.rsuse super::*;
use crate::protocols::http::compression::ResponseCompressionCtx;
use std::ops::{Deref, DerefMut};
pub struct ResponseCompression(ResponseCompressionCtx);
impl Deref for ResponseCompression {
type Target = ResponseCompressionCtx;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for ResponseCompression {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
#[async_trait]
impl HttpModule for ResponseCompression {
fn as_any(&self) -> &dyn std::any::Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
self
}
async fn request_header_filter(&mut self, req: &mut RequestHeader) -> Result<()> {
self.0.request_filter(req);
Ok(())
}
async fn response_header_filter(
&mut self,
resp: &mut ResponseHeader,
end_of_stream: bool,
) -> Result<()> {
self.0.response_header_filter(resp, end_of_stream);
Ok(())
}
fn response_body_filter(
&mut self,
body: &mut Option<Bytes>,
end_of_stream: bool,
) -> Result<()> {
if !self.0.is_enabled() {
return Ok(());
}
let compressed = self.0.response_body_filter(body.as_ref(), end_of_stream);
if compressed.is_some() {
*body = compressed;
}
Ok(())
}
}
pub struct ResponseCompressionBuilder {
level: u32,
}
impl ResponseCompressionBuilder {
pub fn enable(level: u32) -> ModuleBuilder {
Box::new(ResponseCompressionBuilder { level })
}
}
impl HttpModuleBuilder for ResponseCompressionBuilder {
fn init(&self) -> Module {
Box::new(ResponseCompression(ResponseCompressionCtx::new(
self.level, false, false,
)))
}
fn order(&self) -> i16 {
i16::MIN / 2
}
}