# 示例：完全控制请求流程

URL: https://caijiao.org/pingora/examples_take_control_of_the_request
Source: docs/pingora/examples_take_control_of_the_request.md
Description: 通过示例学习如何在 Pingora 中完全控制请求处理流程，包括自定义过滤器、上下文共享和错误处理。

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();
}
````

## 示例说明

1. **前置过滤器**

   * 打印请求路径
   * 在上下文中记录请求开始时间
   * 验证身份令牌，未通过返回 401 错误

2. **响应过滤器**

   * 从上下文获取开始时间
   * 计算请求耗时并打印

3. **完全控制**

   * 可在每个阶段读取或修改请求与响应
   * 支持错误拦截和自定义处理逻辑

## 使用场景

* 自定义认证和权限控制
* 请求统计和监控
* 动态路由和负载均衡
* 错误处理和自定义响应

---

通过这种方式，你可以充分利用 Pingora 的 **阶段化处理** 与 **CTX 上下文**，实现对 HTTP 请求流程的完全掌控，满足复杂代理需求。
