实现内容: 1. 新增 fcgi_handler.h / fcgi_handler.c 模块: - FastCGI 协议核心(BEGIN_REQUEST / PARAMS / STDIN / FCGI_END_REQUEST) - CGI 参数构建(REQUEST_METHOD, SCRIPT_NAME, PATH_INFO, QUERY_STRING 等) - HTTP 响应解析(Status 头提取、默认 200 回退) - 连接池(TCP / Unix Socket 复用)与路由匹配 2. 配置解析扩展(config.c): - 支持 --fastcgi-prefix / --fastcgi-target 等命令行参数 - 支持配置文件的 fastcgi 规则段 - 最大 4 条规则,可配置 pool_size、timeout_ms、unix_socket 3. 请求处理链集成(server.c): - handle_request 中反向代理之后、静态资源之前插入 FastCGI 分发 - server_context 添加 fcgi_config 字段 - server_create / server_destroy 中初始化/销毁连接池 4. Makefile 更新: - 加入 fcgi_handler.c 编译目标 - 测试规则同步更新 5. .gitignore 修复:拆分 tests/fixtures/uploads/ 为独立规则 测试:458 单元测试 + 115 集成测试全部通过 关联:Phase 5 应用网关 — FastCGI 服务器集成
134 lines
4.6 KiB
C
134 lines
4.6 KiB
C
/**
|
||
* cocoon.h - Cocoon 公共头文件
|
||
*
|
||
* 定义错误码、配置结构体、函数声明。
|
||
*
|
||
* @author xfy
|
||
*/
|
||
|
||
#ifndef COCOON_H
|
||
#define COCOON_H
|
||
|
||
#include <stdint.h>
|
||
#include <stdbool.h>
|
||
#include <stddef.h>
|
||
|
||
#include "log.h"
|
||
|
||
#define COCOON_OK 0 /**< 成功 */
|
||
#define COCOON_ERROR -1 /**< 通用错误 */
|
||
#define COCOON_NOMEM -2 /**< 内存不足 */
|
||
#define COCOON_NOTFOUND -3 /**< 文件未找到 */
|
||
#define COCOON_FORBIDDEN -4 /**< 禁止访问 */
|
||
#define COCOON_BADREQUEST -5 /**< 请求格式错误 */
|
||
|
||
/**
|
||
* cocoon_healthcheck_config_t - 健康检查配置
|
||
*/
|
||
typedef struct {
|
||
char path[256]; /* 探测路径(默认 /health) */
|
||
uint32_t interval_ms; /* 探测间隔(毫秒,默认5000) */
|
||
uint32_t timeout_ms; /* 探测超时(毫秒,默认2000) */
|
||
bool enabled; /* 是否启用(默认 false) */
|
||
} cocoon_healthcheck_config_t;
|
||
|
||
/* === 服务器配置 === */
|
||
/**
|
||
* cocoon_config - 服务器配置结构体
|
||
*
|
||
* 命令行参数解析后的配置。
|
||
*/#define COCOON_MAX_PLUGINS 8 /**< 最大插件数量 */
|
||
#define COCOON_MAX_PROXY_RULES 8 /**< 最大代理规则数量 */
|
||
#define COCOON_MAX_VHOSTS 8 /**< 最大虚拟主机数量 */
|
||
|
||
/**
|
||
* cocoon_vhost_t - 虚拟主机配置
|
||
*
|
||
* 根据请求的 Host 头匹配不同的根目录,实现多站点托管。
|
||
*/
|
||
typedef struct {
|
||
char server_name[256]; /**< 域名匹配(如 "example.com" 或 "*.example.com") */
|
||
char root_dir[512]; /**< 该虚拟主机的静态资源根目录 */
|
||
} cocoon_vhost_t;
|
||
|
||
typedef struct cocoon_config {
|
||
const char *root_dir; /**< 静态资源根目录 */
|
||
uint16_t port; /**< 监听端口 */
|
||
bool threaded; /**< 是否启用多线程调度 */
|
||
uint32_t num_workers; /**< 工作线程数(0 = 自动检测) */
|
||
uint32_t max_connections; /**< 最大并发连接数(0 = 无限制) */
|
||
uint32_t timeout_ms; /**< 连接空闲超时毫秒(0 = 默认30000) */
|
||
log_level_t log_level; /**< 日志级别 */
|
||
bool gzip_enabled; /**< 是否启用 gzip 压缩(默认 true) */
|
||
bool brotli_enabled; /**< 是否启用 brotli 压缩(默认 true) */
|
||
bool tls_enabled; /**< 是否启用 TLS(由 cert/key 自动推断) */
|
||
const char *tls_cert; /**< TLS 证书路径 */
|
||
const char *tls_key; /**< TLS 私钥路径 */
|
||
const char *access_log_path; /**< 访问日志文件路径(NULL 或 "-" 表示 stdout) */
|
||
/* 中间件配置 */
|
||
bool cors_enabled; /**< 是否启用 CORS 支持 */
|
||
const char *auth_user; /**< Basic Auth 用户名 */
|
||
const char *auth_pass; /**< Basic Auth 密码 */
|
||
uint32_t rate_limit; /**< 每秒最大请求数(0 表示禁用) */
|
||
/* 插件配置 */
|
||
const char *plugins[COCOON_MAX_PLUGINS]; /**< 插件路径列表 */
|
||
size_t num_plugins; /**< 插件数量 */
|
||
/* 代理配置 */
|
||
struct {
|
||
char prefix[256];
|
||
char target[256];
|
||
uint32_t pool_size; /* 连接池大小(默认4,最大16) */
|
||
uint32_t weight; /* 权重(默认1) */
|
||
/* 主动健康检查 */
|
||
cocoon_healthcheck_config_t healthcheck;
|
||
} proxies[COCOON_MAX_PROXY_RULES];
|
||
size_t num_proxies;
|
||
/* 虚拟主机 */
|
||
cocoon_vhost_t vhosts[COCOON_MAX_VHOSTS];
|
||
size_t num_vhosts;
|
||
/* FastCGI 配置 */
|
||
#define COCOON_MAX_FASTCGI_RULES 4
|
||
struct {
|
||
char prefix[256]; /**< 路径前缀匹配 */
|
||
char host[256]; /**< 后端主机或 Unix socket 路径 */
|
||
int port; /**< 端口(TCP 时有效) */
|
||
bool is_unix_socket; /**< 是否为 Unix domain socket */
|
||
int pool_size; /**< 连接池大小 */
|
||
int timeout_ms; /**< 请求超时 */
|
||
} fastcgi[COCOON_MAX_FASTCGI_RULES];
|
||
size_t num_fastcgi;
|
||
} cocoon_config_t;
|
||
|
||
/* === 服务器生命周期 API === */
|
||
/**
|
||
* cocoon_server_create - 创建服务器实例
|
||
*
|
||
* @param config 配置指针
|
||
* @return 服务器句柄,失败返回 NULL
|
||
*/
|
||
void *cocoon_server_create(const cocoon_config_t *config);
|
||
|
||
/**
|
||
* cocoon_server_run - 启动服务器(阻塞)
|
||
*
|
||
* @param server 服务器句柄
|
||
* @return COCOON_OK 成功,负值错误码
|
||
*/
|
||
int cocoon_server_run(void *server);
|
||
|
||
/**
|
||
* cocoon_server_stop - 优雅关闭服务器
|
||
*
|
||
* @param server 服务器句柄
|
||
*/
|
||
void cocoon_server_stop(void *server);
|
||
|
||
/**
|
||
* cocoon_server_destroy - 销毁服务器实例
|
||
*
|
||
* @param server 服务器句柄
|
||
*/
|
||
void cocoon_server_destroy(void *server);
|
||
|
||
#endif /* COCOON_H */
|