# 在阶段间共享状态（CTX）

URL: https://caijiao.org/pingora/sharing_state_across_phases_with_ctx
Source: docs/pingora/sharing_state_across_phases_with_ctx.md
Description: 学习如何在 Pingora 的请求生命周期中使用上下文（CTX）共享数据，实现跨阶段的信息传递和状态管理。

Pingora 的请求处理采用多阶段机制，每个阶段可以通过 **上下文对象（Context，简称 CTX）** 共享数据。  
这使得你可以在不同阶段读取或修改请求相关状态，实现灵活的逻辑处理。

## CTX 的作用

- 在请求生命周期各阶段传递数据  
- 避免全局变量，提高代码安全性  
- 支持存储任意类型的数据（通过 Rust 类型系统）

## 在 CTX 中存储数据

```rust
use pingora::prelude::*;

fn pre_filter(req: &Request, ctx: &mut Context) -> Result<(), Error> {
    // 记录请求开始时间
    ctx.insert("start_time", std::time::Instant::now());
    Ok(())
}
````

- `insert(key, value)`：存储数据
- key 通常为字符串，value 可为任意可发送类型

## 在后续阶段读取数据

```rust
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(())
}
```

- `get::<T>(key)`：获取指定类型的数据
- 如果 key 不存在，返回 `None`

## 删除或更新 CTX 数据

```rust
ctx.remove("start_time");        // 删除数据
ctx.insert("start_time", new_value); // 更新数据
```

## 使用场景

1. **请求计时**：记录开始和结束时间，计算延迟
2. **身份验证信息**：在认证阶段存储用户信息，后续阶段使用
3. **自定义标记**：根据请求特征标记不同处理策略
4. **错误追踪**：在阶段间传递错误信息，用于统一日志记录

---

通过 CTX，你可以在 Pingora 的不同请求阶段之间安全、灵活地共享数据，从而实现复杂的自定义逻辑与高效的请求处理。
