返回错误的方式
在 Pingora 中处理请求时,可能会遇到各种错误情况。
合理返回错误可以保证客户端得到明确的响应,同时方便日志记录和监控。
错误类型
Pingora 使用 Result<Response, Error> 类型返回处理结果:
use pingora::prelude::*;
fn handle_request(req: &Request, _ctx: &mut Context) -> Result<Response, Error> {
if req.path() == "/forbidden" {
// 返回自定义错误
return Err(Error::new("禁止访问", 403));
}
Ok(Response::new().with_body("请求成功"))
}
`
Ok(Response):正常响应Err(Error):返回错误信息
设置 HTTP 状态码
在返回错误时,可以指定 HTTP 状态码:
let resp = Response::new()
.with_status(500)
.with_body("内部服务器错误");
return Err(Error::from(resp));
常用状态码:
| 状态码 | 含义 |
|---|---|
| 400 | 请求格式错误 |
| 401 | 未认证 |
| 403 | 禁止访问 |
| 404 | 资源未找到 |
| 500 | 服务器内部错误 |
| 502 | 上游服务器错误 |
| 503 | 服务不可用 |
阶段内错误处理
在不同阶段返回错误的方式类似:
fn pre_filter(req: &Request, ctx: &mut Context) -> Result<(), Error> {
if !req.headers().contains_key("X-Auth-Token") {
return Err(Error::new("缺少身份验证令牌", 401));
}
Ok(())
}
- Pre-filter:请求前置阶段,可直接阻止请求
- Response-filter:响应阶段,可修改错误信息或日志记录
错误日志记录
返回错误时建议同时记录日志:
error!("请求 {} 返回错误: {:?}", req.path(), err);
结合配置的 logging 系统,可在日志文件或 systemd journal 中查看。
自定义错误响应示例
fn handle_error(err: Error, _ctx: &mut Context) -> Response {
Response::new()
.with_status(err.status_code())
.with_body(format!("错误信息: {}", err.message()))
}
通过上述方式,你可以在 Pingora 中灵活处理请求错误,返回合适的 HTTP 状态码,并记录详细日志,确保服务稳定可靠。
相关内容
- 高级主题 (WIP) 探索 Pingora 的高级特性,包括内部机制、异步运行时、线程模型和自定义扩展。
- 后台服务 学习如何在 Pingora 中配置和运行后台服务,包括定时任务、异步执行和守护进程管理。
- 异步上下文中的阻塞代码 学习如何在 Pingora 异步运行时中处理阻塞代码,确保高并发请求环境下的性能和稳定性。
- 构建 HTTP 代理 学习如何使用 Pingora 构建 HTTP 代理服务,包括基本请求转发、上游配置和自定义过滤器。
- 配置文件 了解 Pingora 的配置文件结构、主要参数及其作用,学习如何为不同场景编写高效、清晰的配置。
- 连接池与复用 学习如何在 Pingora 中使用连接池和连接复用,提高代理服务的性能和资源利用率。