cocoon/middleware_ext.h
xfy911 bf9787e6e9 feat(phase4): 实现 Phase 4 全部生态扩展模块
新增 4 个核心模块,12 个新文件,约 8832 行源代码 + 测试:

1. 扩展内置中间件 (middleware_ext.c/h)
   - JWT 认证:HS256 (HMAC-SHA256) 签名验证,Base64Url 解码
   - Security Headers:HSTS / X-Frame-Options / CSP / X-XSS-Protection
   - Request ID:32 字符 hex 唯一追踪 ID 生成与透传
   - IP 过滤:IPv4 / CIDR 黑名单与白名单,X-Forwarded-For 解析

2. 分布式负载均衡 (load_balance.c/h)
   - 一致性哈希:MurmurHash3 x86 32-bit + 512 虚拟节点/后端
   - 最少连接:实时活跃连接数跟踪
   - 加权响应时间:EWMA 指数加权移动平均
   - 随机算法

3. gRPC 支持 (grpc.c/h)
   - gRPC over HTTP/2,LEB128 消息帧编解码
   - 四种 RPC 模式:Unary / Server Streaming / Client Streaming / Bidirectional
   - gRPC-Web 兼容,17 个 gRPC 状态码完整支持

4. HTTP/3 (QUIC) (http3.c/h)
   - QUIC 传输层:UDP socket 管理,64-bit 连接 ID
   - HTTP/3 帧处理:HEADERS / DATA / SETTINGS / GOAWAY
   - QPACK 静态表编解码 (RFC 9204)
   - TLS 1.3 集成接口

新增单元测试:
- test_middleware_ext.c: 53 项测试
- test_load_balance.c: 56 项测试
- test_grpc.c: 88 项测试
- test_http3.c: 64 项测试
- 新增合计:261 项,累计 451 项

同时替换 coco 子模块为内联 stub 头文件,
确保无需外部依赖即可编译。
2026-06-10 11:36:45 +08:00

185 lines
5.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file middleware_ext.h - 扩展内置中间件接口
*
* Phase 4 第一项:扩展中间件系统,新增 4 个内置中间件
* - JWT 认证中间件 (middleware_jwt)
* - Security Headers 中间件 (middleware_security_headers)
* - Request ID 中间件 (middleware_request_id)
* - IP 过滤中间件 (middleware_ip_filter)
*
* @author xfy
*/
#ifndef COCOON_MIDDLEWARE_EXT_H
#define COCOON_MIDDLEWARE_EXT_H
#include "middleware.h"
#include "platform.h"
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ===== JWT 认证中间件 ===== */
/** JWT 密钥最大长度 */
#define COCOON_JWT_SECRET_MAX 256
/** JWT Token 最大长度 */
#define COCOON_JWT_TOKEN_MAX 2048
/**
* @brief JWT 中间件配置
*
* 用于 cocoon_middleware_jwt() 的用户数据。
*/
typedef struct {
char secret[COCOON_JWT_SECRET_MAX]; /**< JWT 签名密钥 */
char header_name[64]; /**< 默认 "Authorization" */
char prefix[16]; /**< 默认 "Bearer " */
uint32_t max_age; /**< Token 最大有效期(秒,默认 3600 */
bool skip_preflight; /**< 是否跳过 OPTIONS 预检请求 */
} cocoon_jwt_config_t;
/**
* @brief JWT 认证中间件
*
* 验证 Authorization: Bearer <token> 中的 JWT token。
* 使用 HS256 (HMAC-SHA256) 签名验证。
* Token 格式header.payload.signatureBase64Url 编码)
*
* @param req HTTP 请求
* @param fd 客户端 socket
* @param user_data 指向 cocoon_jwt_config_t 的指针
* @return 0 验证通过继续处理1 验证失败(已发送 401
*/
int cocoon_middleware_jwt(http_request_t *req, cocoon_socket_t fd, void *user_data);
/* ===== Security Headers 中间件 ===== */
/**
* @brief Security Headers 全局配置
*
* 由中间件设置server.c 发送响应前读取。
*/
typedef struct {
bool hsts_enabled; /**< Strict-Transport-Security */
uint32_t hsts_max_age; /**< max-age默认 31536000 = 1年 */
bool hsts_include_subdomains;/**< includeSubDomains */
bool frame_options_enabled; /**< X-Frame-Options */
char frame_options[32]; /**< DENY 或 SAMEORIGIN默认 DENY */
bool xss_protection_enabled; /**< X-XSS-Protection */
bool csp_enabled; /**< Content-Security-Policy */
char csp_policy[512]; /**< CSP 策略字符串 */
bool content_type_options; /**< X-Content-Type-Options: nosniff */
bool referrer_policy_enabled;/**< Referrer-Policy */
char referrer_policy[32]; /**< strict-origin-when-cross-origin */
} cocoon_security_headers_config_t;
/**
* @brief Security Headers 中间件
*
* 设置全局安全头配置。中间件本身返回 0继续处理
* 由 server.c 在发送响应时调用 cocoon_middleware_security_headers_get() 获取配置。
*
* @param req HTTP 请求
* @param fd 客户端 socket未使用
* @param user_data 指向 cocoon_security_headers_config_t 的指针
* @return 始终返回 0继续处理
*/
int cocoon_middleware_security_headers(http_request_t *req, cocoon_socket_t fd, void *user_data);
/**
* @brief 获取当前 Security Headers 配置
*
* 供 server.c 在发送响应前调用,将安全头追加到响应中。
*
* @return 指向当前全局配置的指针,未设置时返回 NULL
*/
const cocoon_security_headers_config_t *cocoon_middleware_security_headers_get(void);
/* ===== Request ID 中间件 ===== */
/** Request ID 长度32 字符 hex */
#define COCOON_REQUEST_ID_LEN 32
/**
* @brief Request ID 中间件配置
*/
typedef struct {
char header_name[32]; /**< 默认 "X-Request-ID" */
bool trust_incoming; /**< 是否信任客户端传入的 ID默认 true */
} cocoon_request_id_config_t;
/**
* @brief Request ID 中间件
*
* 生成 32 字符 hex 唯一追踪 ID。
* 如果 trust_incoming=true 且请求头已有 ID则复用。
* 将 ID 添加到响应头 X-Request-ID。
*
* @param req HTTP 请求
* @param fd 客户端 socket
* @param user_data 指向 cocoon_request_id_config_t 的指针
* @return 始终返回 0继续处理
*/
int cocoon_middleware_request_id(http_request_t *req, cocoon_socket_t fd, void *user_data);
/* ===== IP 过滤中间件 ===== */
/** IP 过滤列表最大条目数 */
#define COCOON_IP_FILTER_MAX 64
/**
* @brief IP 过滤模式
*/
typedef enum {
COCOON_IP_FILTER_DENY, /**< 黑名单模式:匹配则拒绝 */
COCOON_IP_FILTER_ALLOW /**< 白名单模式:不匹配则拒绝 */
} cocoon_ip_filter_mode_t;
/**
* @brief IP 过滤中间件配置
*
* 支持 IPv4 地址和 CIDR如 "192.168.1.0/24")。
*/
typedef struct {
char entries[COCOON_IP_FILTER_MAX][64]; /**< IP 或 CIDR 字符串 */
size_t count; /**< 实际条目数 */
cocoon_ip_filter_mode_t mode; /**< 黑名单或白名单模式 */
char deny_message[256]; /**< 拒绝时的响应消息 */
} cocoon_ip_filter_config_t;
/**
* @brief IP 过滤中间件
*
* 黑名单模式:匹配则返回 403
* 白名单模式:不匹配则返回 403
* 支持解析 X-Forwarded-For 头获取真实 IP。
*
* @param req HTTP 请求
* @param fd 客户端 socket
* @param user_data 指向 cocoon_ip_filter_config_t 的指针
* @return 0 允许继续处理1 已拒绝(已发送 403
*/
int cocoon_middleware_ip_filter(http_request_t *req, cocoon_socket_t fd, void *user_data);
/* ===== 一键初始化 ===== */
/**
* @brief 一键注册所有扩展中间件
*
* 根据配置注册 Phase 4 新增的 4 个内置中间件。
*
* @param server_config 服务器配置(可包含中间件配置)
*/
void cocoon_middleware_init_extended(void *server_config);
#ifdef __cplusplus
}
#endif
#endif /* COCOON_MIDDLEWARE_EXT_H */