1 个不稳定版本
0.2.0 | 2024 年 5 月 12 日 |
---|
#1179 在 HTTP 服务器 中
20KB
129 行
Pingora 压缩模块
这个crate帮助配置Pingora的内置压缩机制。它提供两种配置选项
compression_level
(--compression-level
作为命令行选项):如果存在,将启用动态下游压缩并使用指定的压缩级别(所有压缩算法使用相同级别,见 Pingora 问题 #228)。decompress_upstream
(--decompress-upstream
作为命令行标志):如果true
,将启用上游响应的解压缩。
代码示例
通常,您希望将Pingora的命令行选项和配置设置与此crate提供的选项合并
use compression_module::{CompressionConf, CompressionHandler, CompressionOpt};
use module_utils::{merge_conf, merge_opt, FromYaml};
use pingora_core::server::Server;
use pingora_core::server::configuration::{Opt as ServerOpt, ServerConf};
use structopt::StructOpt;
#[merge_opt]
struct Opt {
server: ServerOpt,
compression: CompressionOpt,
}
#[merge_conf]
struct Conf {
server: ServerConf,
compression: CompressionConf,
}
let opt = Opt::from_args();
let mut conf = opt
.server
.conf
.as_ref()
.and_then(|path| Conf::load_from_yaml(path).ok())
.unwrap_or_else(Conf::default);
conf.compression.merge_with_opt(opt.compression);
let mut server = Server::new_with_opt_and_conf(opt.server, conf.server);
server.bootstrap();
let compression_handler: CompressionHandler = conf.compression.try_into().unwrap();
然后您可以在您的服务器实现中使用该处理器
use async_trait::async_trait;
use compression_module::CompressionHandler;
use module_utils::RequestFilter;
use pingora_core::Error;
use pingora_core::upstreams::peer::HttpPeer;
use pingora_proxy::{ProxyHttp, Session};
pub struct MyServer {
compression_handler: CompressionHandler,
}
#[async_trait]
impl ProxyHttp for MyServer {
type CTX = <CompressionHandler as RequestFilter>::CTX;
fn new_ctx(&self) -> Self::CTX {
CompressionHandler::new_ctx()
}
async fn request_filter(
&self,
session: &mut Session,
ctx: &mut Self::CTX,
) -> Result<bool, Box<Error>> {
// Enable compression according to settings
self.compression_handler.handle(session, ctx).await
}
async fn upstream_peer(
&self,
_session: &mut Session,
_ctx: &mut Self::CTX,
) -> Result<Box<HttpPeer>, Box<Error>> {
Ok(Box::new(HttpPeer::new(
"example.com:443",
true,
"example.com".to_owned(),
)))
}
}
有关完整和更现实的代码,请参阅存储库中的 single-static-root
示例。
依赖项
~37–55MB
~1M SLoC