主题
示例:完全控制请求流程
Pingora 提供灵活的 过滤器机制 和 上下文管理,允许你在请求的每个阶段进行自定义操作,实现对请求流程的完全控制。
构建自定义代理
以下示例展示如何构建一个自定义代理服务:
rust
use pingora::prelude::*;
fn pre_filter(req: &Request, ctx: &mut Context) -> Result<(), Error> {
println!("请求路径: {}", req.path());
ctx.insert("start_time", std::time::Instant::now());
// 简单身份验证
if !req.headers().contains_key("X-Auth-Token") {
return Err(Error::new("未授权访问", 401));
}
Ok(())
}
fn response_filter(_req: &Request, ctx: &mut Context) -> Result<(), Error> {
if let Some(start) = ctx.get::<std::time::Instant>("start_time") {
let duration = start.elapsed();
println!("请求耗时: {:?}", duration);
}
Ok(())
}
#[tokio::main]
async fn main() {
let mut server = Server::new(None).unwrap();
server.bootstrap();
let mut app = http_proxy_service(None);
app.add_filter(pre_filter); // 前置过滤器
app.add_filter_at_stage(FilterStage::Response, response_filter); // 响应过滤器
server.run_forever(app).unwrap();
}
示例说明
前置过滤器
- 打印请求路径
- 在上下文中记录请求开始时间
- 验证身份令牌,未通过返回 401 错误
响应过滤器
- 从上下文获取开始时间
- 计算请求耗时并打印
完全控制
- 可在每个阶段读取或修改请求与响应
- 支持错误拦截和自定义处理逻辑
使用场景
- 自定义认证和权限控制
- 请求统计和监控
- 动态路由和负载均衡
- 错误处理和自定义响应
通过这种方式,你可以充分利用 Pingora 的 阶段化处理 与 CTX 上下文,实现对 HTTP 请求流程的完全掌控,满足复杂代理需求。