vixcpp/middleware
GitHub: vixcpp/middleware
为 Vix.cpp HTTP 运行时提供可组合、非阻塞的现代化中间件系统,内置认证、安全加固、速率限制和缓存等生产级预设。
Stars: 0 | Forks: 0
# Vix 中间件
高性能 • 非阻塞 • 可组合 • 面向生产
Vix **middleware** 模块为 **Vix.cpp HTTP runtime** 提供了一个现代化、人性化的中间件系统。
它专为实际应用设计:安全加固、解析、认证、请求范围状态以及安全组合。
该模块支持**两种中间件风格**:
* **基于上下文的中间件** (`MiddlewareFn`) —— 推荐
* **传统 HTTP 中间件** (`HttpMiddleware`) —— 通过适配器支持
它还内置了**开箱即用的预设**(CORS、速率限制、CSRF、安全标头、IP 过滤、解析器、认证、HTTP 缓存)。
## 为什么要有这个模块
大多数 C++ “中间件”系统要么:
* 过于依赖特定框架
* 难以组合
* 容易意外阻塞
* 对安全性不明确(提前返回、状态变更、可观察行为)
Vix middleware 旨在做到:
* **显式**:每个中间件都决定是继续 (`next()`) 还是停止
* **可组合**:清晰地链接中间件
* **安全**:防御性解析、可预测的提前返回、没有隐藏的魔法
* **快速**:尽可能零成本抽象,默认采用非阻塞模式
## 快速开始
运行完整的“mega 示例”:
```
vix run examples/http_middleware/mega_middleware_routes.cpp
```
快速测试:
```
curl -i http://127.0.0.1:8080/
curl -i http://127.0.0.1:8080/api/ping -H "x-demo: 1"
curl -i http://127.0.0.1:8080/api/secure/whoami -H "x-api-key: dev_key_123"
curl -i http://127.0.0.1:8080/dev/trace
curl -i http://127.0.0.1:8080/api/cache/demo
curl -i http://127.0.0.1:8080/api/cache/demo -H "x-vix-cache: bypass"
```
## 最小示例
### 1) 一个简单的基于上下文的中间件
```
#include
#include
static vix::middleware::MiddlewareFn hello_mw()
{
return [](vix::middleware::Context& ctx, vix::middleware::Next next) {
ctx.res().header("x-hello", "vix");
next();
};
}
int main()
{
vix::App app;
// Adapt ctx middleware into an App middleware
app.use(vix::middleware::app::adapt_ctx(hello_mw()));
app.get("/", [](auto&, auto& res) {
res.send("ok");
});
app.run(8080);
}
```
### 2) 一个传统风格的中间件(仍然支持)
```
#include
#include
static vix::middleware::HttpMiddleware require_header(std::string key)
{
return [key = std::move(key)](vix::Request& req, vix::Response& res, vix::middleware::Next next) {
if (req.header(key).empty()) {
res.status(401).send("missing header");
return; // do not call next()
}
next();
};
}
int main()
{
vix::App app;
// Adapt legacy middleware into an App middleware
app.use(vix::middleware::app::adapt(require_header("x-demo")));
app.get("/", [](auto&, auto& res) {
res.send("ok");
});
app.run(8080);
}
```
## 核心概念
### 1) 基于上下文的中间件(推荐)
`MiddlewareFn` 如下所示:
```
(vix::middleware::Context& ctx, vix::middleware::Next next) -> void
```
规则:
* 要继续流水线,请调用 `next()`。
* 要提前停止,**不要**调用 `next()`。
* 您可以修改请求/响应并存储请求范围的状态。
### 2) RequestState(跨中间件和处理程序存储数据)
Vix 提供了基于类型的请求存储(类似于 `std::any`)。
```
struct AuthInfo { bool authed{}; std::string role; };
ctx.req().emplace_state(AuthInfo{true, "admin"});
if (ctx.req().has_state_type()) {
const auto& a = ctx.req().state();
}
```
用于:
* 将计算数据传递给处理程序
* 保存认证/会话信息
* 跟踪时间/追踪 ID
* 附加解析结果
### 3) 安装模式
应用适配器层提供安装助手:
* `app.use(mw)` —— 全局
* `install(app, "/prefix/", mw)` —— 前缀中间件
* `install_exact(app, "/path", mw)` —— 精确路径中间件
* `chain(mw1, mw2, ...)` —— 组合中间件
这就是您构建安全且可读的路由保护的方式:
```
using namespace vix::middleware::app;
install(app, "/api/", rate_limit_dev(120, std::chrono::minutes(1)));
install(app, "/api/secure/", api_key_dev("dev_key_123"));
install(app, "/api/admin/", chain(adapt_ctx(fake_auth()), adapt_ctx(require_admin())));
```
## 包含的预设
该模块包含满足常见需求的“电池内置”中间件预设。
名称可能根据您的代码树结构略有不同,但示例演示了:
### 安全
* CORS(开发/可配置)
* 安全标头
* CSRF(可选)
* IP 过滤
### 速率限制
* 简单的内存开发限制器(适用于本地、演示、CI)
### 认证
* API 密钥
* JWT(启用时)
* 类 RBAC 门控模式
### 解析器
* JSON 解析器
* 表单解析器
* Multipart 解析器
* Multipart 保存(安全地将上传内容写入磁盘)
### HTTP 缓存(GET 缓存)
用于 GET 端点的缓存中间件,带有显式绕过控制:
* 基于 TTL 的缓存
* 可选绕过标头(例如 `x-vix-cache: bypass`)
* 调试标头(例如 `x-vix-cache-status: hit/miss/bypass`)
## 完整参考示例
推荐的起点是:
* `examples/http_middleware/mega_middleware_routes.cpp`
它演示了:
* 路由(GET/POST 等)
* 全局中间件 (`App::use`)
* 前缀中间件 (`install`)
* 精确路径中间件 (`install_exact`)
* `adapt_ctx()` 和 `adapt()`
* 中间件链 (`chain`)
* 安全预设(CORS、标头、CSRF、IP 过滤)
* 速率限制
* 解析器(JSON、表单、multipart)
* 认证(API 密钥、角色门控)
* HTTP 缓存(GET)
* RequestState 模式
* 提前返回模式和防御性 JSON 响应
## 目录布局
典型布局:
```
modules/middleware/
│
├─ include/vix/middleware/
│ ├─ app/
│ │ ├─ adapter.hpp # adapt_ctx(), adapt(), install(), chain(), ...
│ │ ├─ presets.hpp # cors_dev(), rate_limit_dev(), api_key_dev(), ...
│ │ └─ http_cache.hpp # install_http_cache() + config
│ ├─ Context.hpp
│ ├─ Middleware.hpp
│ └─ ...
│
└─ examples/
└─ http_middleware/
└─ mega_middleware_routes.cpp
```
## 设计理念
* **仅控制平面**:中间件显式决定流程。
* **无隐藏阻塞**:处理程序保持简短;繁重的工作应被调度。
* **防御性解析**:无效输入产生可预测的错误。
* **可观察行为**:追踪 ID、调试标头、显式缓存绕过。
* **默认可组合**:链式和前缀安装构建可读的安全性。
## 许可证
MIT —— 与 Vix.cpp 相同
仓库:[https://github.com/vixcpp/vix](https://github.com/vixcpp/vix)
标签:C++, CISA项目, CORS跨域, CSRF防护, ETW劫持, HTTP服务器, HTTP缓存, IP过滤, PE 加载器, Syscall, Vix.cpp, Web开发, Web框架组件, 上下文管理, 中间件, 可组合性, 后端开发, 安全头, 数据压缩, 数据擦除, 日志记录, 生产环境, 网络安全, 请求处理, 错误处理, 限流, 隐私保护, 零成本抽象, 非阻塞IO