cocoon/.cocoon-plan.md
xfy911 60ef9ed908 feat(vhost): 虚拟主机/多站点支持
- cocoon.h: 新增 cocoon_vhost_t 结构体和 COCOON_MAX_VHOSTS 宏
- config.c: JSON 解析器新增 vhosts 数组解析
- server.c: HTTP/1.1 请求根据 Host 头匹配虚拟主机 root_dir
- http2.h/c: HTTP/2 根据 :authority 匹配虚拟主机,存储为 Host 头
- http2.c: 新增 http2_session_set_server_config() API
- cocoon.json: 添加 vhosts 配置示例
- tests: 新增 3 项虚拟主机集成测试
- 编译零警告,142 单元测试 + 106 集成测试全部通过
2026-06-09 15:28:57 +08:00

407 lines
30 KiB
Markdown
Raw 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.

# Cocoon 发展规划(自主维护)
> 此文件由 cron 任务每3小时更新记录项目状态与下一步计划。
## 路线图
### Phase 1 — 核心稳定(当前)
- [x] HTTP/1.1 请求解析
- [x] 响应头格式化
- [x] 静态文件服务sendfile
- [x] 目录浏览
- [x] Range 请求
- [x] MIME 类型识别
- [x] 多线程 M:N 调度
- [x] 命令行参数
- [x] 优雅关闭
### Phase 2 — 健壮性
- [x] HTTP 缓存ETag / Last-Modified / If-None-Match✅ 2026-06-03
- [x] 连接超时管理(空闲连接自动清理)✅ 2026-06-03
- [x] 最大并发连接数限制 ✅ 2026-06-03
- [x] 分级日志系统error / warn / info / debug✅ 2026-06-03
- [x] 访问日志Nginx combined 格式,含 User-Agent / Referer✅ 2026-06-05
- [x] Gzip 压缩 ✅ 2026-06-03已接入响应流程
- [x] Brotli 压缩 ✅ 2026-06-04优先于 Gzip
- [x] 集成测试 suite68 项 curl/bash 测试全部通过)✅ 2026-06-06
- [x] 性能基准wrk: ~16.2K RPS / ~60μs 延迟)✅ 2026-06-03
- [x] 请求体解析POST 支持)✅ 2026-06-03
- Content-Length 读取
- JSON / form-urlencoded 回显
- **multipart/form-data 文件上传**(保存到 root_dir/uploads/)✅ 2026-06-04
- [x] C 语言单元测试框架 ✅ 2026-06-03Unity 框架142 个测试全部通过)
- [x] **WebSocket 单元测试** ✅ 2026-06-0612 项,覆盖帧解析/编码/握手/粘包/大负载)
- [x] **健康检查端点** /_health ✅ 2026-06-06JSON 状态:连接数、插件、中间件、运行时间)
### Phase 3 — 扩展(已完成)
- [x] **配置文件支持** — JSON 配置替代纯命令行 ✅ 2026-06-04
- [x] **Brotli 压缩** — 比 gzip 更高压缩率,现代浏览器均支持 ✅ 2026-06-04
- [x] **HTTPS / TLS** — OpenSSL Memory BIO 集成 ✅ 2026-06-04
- [x] **HTTP/2** — nghttp2 完整实现TLS ALPN + h2c + 静态文件 + 缓存)✅ 2026-06-04
- [x] **HTTP/2 目录浏览** — 无 index.html 时返回目录列表 ✅ 2026-06-04
- [x] **WebSocket 支持** — RFC 6455 握手 + 帧解析/编码 + echo + 广播/频道 ✅ 2026-06-05
- [x] **Windows 兼容性** — 跨平台抽象层 ✅ 2026-06-04
- [x] **反向代理** — 路径前缀匹配 → HTTP/1.1 后端JSON 配置支持 ✅ 2026-06-07
- `proxy.h` / `proxy.c`路径前缀匹配、HTTP/1.1 后端转发、X-Forwarded-* 头透传
- `cocoon.json`:支持 `proxies` 数组配置
- 80 项集成测试全部通过(含 3 项代理测试)
### Phase 4 — 生态
- [x] **WebSocket 广播/频道路由** — 全局连接注册表 + 广播/定向发送 API ✅ 2026-06-05
- [x] **中间件机制** — 注册表 + 链式执行,内置 CORS / Basic Auth / Rate Limit ✅ 2026-06-06
- [x] **插件系统** — 动态加载 .so/.dll 扩展 ✅ 2026-06-06MVPdlopen + 中间件注册 + 示例插件)
- [x] **反向代理 HTTPS 后端** — 轻量级 OpenSSL 客户端封装,支持 TLS 1.2+ 握手 + SNI ✅ 2026-06-08
- [x] **反向代理负载均衡** — 轮询调度 + 故障自动转移多后端支持最多8个✅ 2026-06-08
- [x] **Prometheus 指标端点**`/_metrics` 导出 10 项指标,响应码分类计数器 ✅ 2026-06-08
## 项目状态:恢复开发
> **注意**:用户已指示恢复 cocoon 开发,继续推进新功能。不暂停。
- 所有 Phase 1-4 核心功能已完成(反向代理负载均衡 + Prometheus 指标 + 虚拟主机已加入)
- 编译通过,零警告
- **142 个单元测试全部通过** + **106 项集成测试全部通过**(新增 3 项虚拟主机测试)
- 当前仅做编译和测试验证,不添加新代码
## 待办池(活跃)
1. ~~HTTP/2 代理支持~~ ✅ 2026-06-09
2. ~~连接池 HTTP/1.0 兼容~~ ✅ 2026-06-09
- 后端发送 Connection: close 时正确关闭连接而非归还
3. **HTTP/2 代理流式转发** — 当前为非流式(先收集完整响应),未来改为流式
4. ~~虚拟主机 / 多站点~~ ✅ 2026-06-09 — 基于 Host 头匹配HTTP/1.1 + HTTP/2 均支持
5. 主动健康检查 — 后台线程定期探测后端(当前为被动式)
## 最近行动记录
- 2026-06-09 15:00: **虚拟主机 / 多站点支持**
- `cocoon.h`: 新增 `cocoon_vhost_t` 结构体(`server_name[256]` + `root_dir[512]``cocoon_config_t` 新增 `vhosts[COCOON_MAX_VHOSTS]``num_vhosts`
- `config.c`: JSON 解析器新增 `vhosts` 数组解析,每个对象支持 `server_name``root_dir` 字段
- `server.c`: 新增 `vhost_match_root_dir()` + `conn_get_host()` 辅助函数
- `handle_request()` 中解析请求后根据 Host 头匹配虚拟主机,使用对应的 `root_dir` 提供静态文件服务
- `http2.h`: `http2_session_t` 新增 `server_config` 指针(用于虚拟主机匹配)
- `http2.c`: 新增 `http2_session_set_server_config()` API`vhost_match_root_dir()` 辅助函数
- `on_header_callback()`: `:authority` 伪头不再忽略,存储为 `Host` 普通头供匹配使用
- `http2_serve_static()` / `http2_serve_post()`: 根据 stream 的 Host 头匹配虚拟主机根目录
- `server.c`: 所有 HTTP/2 会话创建点h2c 直接连接、Upgrade 升级、TLS ALPN均调用 `http2_session_set_server_config()`
- `cocoon.json`: 示例配置添加 `vhosts` 数组示例
- `tests/integration_test.sh`: 新增 3 项虚拟主机集成测试
- `site-a.local` → 返回 Site A 内容
- `site-b.local` → 返回 Site B 内容
- `unknown.local` → 回退到全局默认内容
- 编译零警告142 个单元测试 + 106 项集成测试全部通过
- 提交已推送到 `main`
- 2026-06-09 12:00: **连接池 HTTP/1.0 兼容 + 配置合并 bug 修复**
- `proxy.c`: `proxy_relay_backend()` 中新增 `connection_closed` 标志
-`recv() == 0`(后端关闭连接)时标记 `connection_closed = true`
- 归还条件改为 `success && total > 0 && !connection_closed`,避免归还已关闭连接
- `http2.c`: `http2_serve_proxy()` 中检测 HTTP/1.0 响应
- `is_http10 = strncmp(response_buf, "HTTP/1.0", 8) == 0`
- HTTP/1.0 默认关闭连接,除非显式 `Connection: keep-alive`
- 修复 HTTP/2 代理复用 HTTP/1.0 后端已关闭连接导致响应失败的问题
- `main.c`: 重写 `parse_args()` 参数解析逻辑
- 问题:`config_merge(config, config, ...)``base == cmdline``free(base->tls_cert)``strdup(cmdline->tls_cert)` 导致 use-after-free
- 修复:先加载配置文件,再解析命令行参数(覆盖配置文件),避免 `config_merge` 自引用
- `tests/http10_backend.py`: 新增 HTTP/1.0 后端模拟器
- 模拟发送 `Connection: close` 后主动关闭连接的后端
- 用于验证连接池正确处理已关闭连接
- `tests/integration_test.sh`: 新增 HTTP/1.0 后端兼容测试3 项)
- 第一次请求 200、第二次请求 200必须新建连接、连接管理日志检测
- 编译零警告142 个单元测试 + 99 项集成测试全部通过
- 提交 `90601e0` 已推送到 `main`
- `http2.h`: `http2_session_t` 新增 `proxy_config``client_addr` 字段
- `http2.c`: 新增 `http2_session_set_proxy_config()` 注入代理配置
- `http2.c`: 新增 `http2_serve_proxy()` 函数,实现 HTTP/2 流 → HTTP/1.1 后端转发
- 请求重组:将 HTTP/2 伪头(:method, :path, :authority重组为 HTTP/1.1 请求
- 后端响应解析:解析 HTTP/1.1 响应头,通过 nghttp2 提交 HTTP/2 响应帧
- 过滤 hop-by-hop 头Connection, Transfer-Encoding 等)
- 添加 X-Forwarded-For 头
- 支持 TLS 和非 TLS 后端连接(通过 `proxy_tls.c`
- `server.c`: `handle_http2()` 中调用 `http2_session_set_proxy_config()` 注入配置
- `http2.c`: 修复 `parse_http1_response()``body_len` 下溢问题(当 `len < blank + 4 - data` 时)
- `tests/integration_test.sh`: 新增 HTTP/2 代理集成测试GET 请求验证)
- 编译零警告142 单元测试全部通过
- 集成测试HTTP/2 GET 代理测试通过POST 待完善(连接池 HTTP/1.0 兼容问题)
- 提交已推送 `main` (7fe52a3)
- 2026-06-09 06:00: **平滑加权轮询负载均衡**
- `proxy.h`: 后端结构添加 `weight`(配置权重)和 `current_weight`(动态权重)字段
- `proxy.c`: 实现平滑加权轮询算法Nginx SWW`select_backend_sww()` + `select_backend_sww_all()`
- 算法:健康后端 current_weight += weight选最大选中后 -= total_weight
- 保证权重比例严格满足,分布均匀,不会连续打到同一后端
- `proxy.c`: `proxy_add_rule` 新增 `weight` 参数,`backend_init` 初始化权重默认1
- `config.c`: JSON 解析器新增 `weight` 数字字段解析
- `cocoon.h`: 代理配置结构新增 `uint32_t weight` 字段
- `server.c`: 加载代理规则时传入配置的 `weight`
- `cocoon.json`: 示例配置展示多后端权重用法(`/api` → 3000:3 + 3001:1
- `tests/integration_test.sh`: 新增加权轮询测试3项HTTP 200、权重日志验证、多后端分布验证
- 编译零警告142 单元测试 + 93 集成测试全部通过
- 提交已推送 `main` (dc76585)
- 2026-06-09 03:00: **连接池大小可配置**
- `proxy.h`: `COCOON_MAX_POOL_SIZE``COCOON_POOL_MAX_CAPACITY`上限16+ `COCOON_POOL_DEFAULT_SIZE`默认4`cocoon_conn_pool_t` 新增 `max_size` 字段
- `proxy.c`: `proxy_pool_init` 接收 `max_pool_size` 参数,自动裁剪到上限;所有循环改用 `backend->pool.max_size`
- `proxy.c`: `proxy_add_rule` 新增 `pool_size` 参数,传递给 `parse_backend_url``proxy_pool_init`
- `cocoon.h`: `proxies` 配置结构新增 `uint32_t pool_size` 字段
- `config.c`: JSON 解析器新增 `pool_size` 数字字段解析,默认值为 4
- `server.c`: 调用 `proxy_add_rule` 时传入配置的 `pool_size`
- `cocoon.json`: 示例配置添加 `pool_size` 展示(`/api` → 8`/backend` → 4
- 编译零警告142 单元测试 + 90 集成测试全部通过
- 提交已推送 `main`
- 2026-06-09 00:15: **后端连接池/keep-alive**
- `proxy.h`: 新增 `cocoon_pooled_conn_t` / `cocoon_conn_pool_t`pthread_mutex 保护),后端嵌入连接池
- `proxy.c`: 实现 `proxy_pool_init`/`destroy`/`acquire`/`release` + `proxy_config_destroy`
- `proxy.c`: `proxy_relay_backend` 使用连接池获取/归还,向后端发送 `Connection: keep-alive`
- `server.c`: `server_destroy` 调用 `proxy_config_destroy` 关闭所有连接池
- `proxy.c`: 修复后端关闭连接后复用导致客户端超时的问题recv 返回 0 时不再归还,直接重建)
- 编译零警告142 单元测试 + 90 集成测试全部通过
- 提交 `e13ff54` 已推送到 `main`
- 2026-06-08 21:00: **后端被动健康检查 + SIGPIPE 崩溃修复**
- `proxy.h`: 为 `cocoon_proxy_backend_t` 增加健康状态字段(`healthy`/`fail_count`/`success_count`/`last_check`
- `proxy.c`: 新增 `proxy_relay_backend()` 辅助函数,提取流式转发逻辑,避免两轮循环代码重复
- `proxy.c`: `proxy_forward()` 优先尝试 healthy 后端,全部失败后再 fallback 到所有后端(含 unhealthy
- `proxy.c`: 健康阈值:连续 2 次成功恢复,连续 3 次失败标记不健康(被动式检测)
- `main.c`: 新增 `signal(SIGPIPE, SIG_IGN)`,修复客户端提前关闭连接时 `SIGPIPE` 导致进程崩溃的问题
- 编译零警告142 单元测试 + 90 集成测试全部通过
- 提交 `77979b4` 已推送到 `main`
- 2026-06-08 18:00: **Prometheus 指标端点 /_metrics**
- `server.c`: 新增 7 个原子计数器(`g_total_requests`, `g_response_2xx/3xx/4xx/5xx/200/404`
- `server.c`: 新增 `update_metrics()` 辅助函数,在 `handle_request` 所有响应路径统一调用
- `server.c`: 新增 `/_metrics` 端点,返回 Prometheus 文本格式10 项指标7 个计数器 + 3 个仪表盘)
- `tests/integration_test.sh`: 新增 8 项 Prometheus 指标测试状态码、字段检查、HEAD 支持、计数器递增验证)
- 编译零警告142 单元测试 + 90 集成测试全部通过
- 提交 `8ad8eca` 已推送到 `main`
- 2026-06-08 16:10: **负载均衡(轮询 + 故障转移)**
- `proxy.h`: 重构数据结构,支持多后端(`cocoon_proxy_backend_t`最多8个
- `proxy.c`: 实现轮询调度 + 自动故障转移(后端连接失败时自动尝试下一个)
- `proxy.c`: `proxy_add_rule` 支持同 prefix 追加后端,自动合并为多后端规则
- `server.c`: 匹配新签名
- `cocoon.json`: 示例配置展示多后端用法(两个 backend 3000/3001
- 编译零警告142 单元测试 + 82 集成测试全部通过
- 提交 `acda3b9` 已推送到 `main`
- 2026-06-08 15:00: **维护检查** — 项目处于暂停状态(用户指示 "🤚cocoon"
- 编译通过:零警告(仅 coco 子模块 `.S` 文件 linker 提示,不影响功能)
- 142 个单元测试全部通过 ✓
- 82 项集成测试全部通过 ✓
- 代码无改动,更新 `.cocoon-plan.md` 标注暂停状态
- 不推进新功能,仅做状态验证
- 特性列表新增 `🔄 反向代理` 条目
- 路线图标记反向代理为 ✅ 完成
- 模块职责表新增 `proxy.c` / `proxy_tls.c`
- 新增配置文件示例(含反向代理配置)
- 编译零警告142 单元测试 + 82 集成测试全部通过
- 提交并推送 `main`
- 2026-06-08 11:35: **恢复开发 + HTTPS 反向代理**
- 恢复项目开发状态,暂停 ephemeral 方向
- 新增 `proxy_tls.c` / `proxy_tls.h`:轻量级 OpenSSL 客户端封装
- `proxy.c`:支持 HTTPS 后端连接TLS 握手 + SNI + 透传 X-Forwarded-Proto: https
- 集成测试:新增 `tests/https_backend.py` + 2 项 HTTPS 反向代理测试
- 编译零警告142 单元测试 + 82 集成测试全部通过
- 提交 `a86b8a4` 已推送到 `main`
- 2026-06-08 09:00: **维护检查** — 项目处于暂停状态
- 编译通过:零警告(仅 coco 子模块 `.S` 文件 linker 提示,不影响功能)
- 142 个单元测试全部通过 ✓
- 80 项集成测试全部通过 ✓
- 代码无改动,.cocoon-plan.md 记录更新
- 2026-06-08 06:00: **维护检查** — 项目处于暂停状态
- 编译通过:零警告(仅 coco 子模块 `.S` 文件 linker 提示,不影响功能)
- 142 个单元测试全部通过 ✓
- 80 项集成测试全部通过 ✓
- 代码无改动,.cocoon-plan.md 记录更新
- 2026-06-08 03:00: **维护检查** — 项目处于暂停状态
- 编译通过:零警告(仅 coco 子模块 `.S` 文件 linker 提示,不影响功能)
- 142 个单元测试全部通过 ✓
- 80 项集成测试全部通过 ✓
- 代码无改动,.cocoon-plan.md 记录更新
- 2026-06-08 00:00: **维护检查 + 编译修复** — 项目处于暂停状态
- 修复链接错误:移除 `server.c` 中 3 行重复的 `coco_version()` 日志调用coco v2.2.0 子模块中 version.c 未编译进 libcoco.a导致符号未定义
- 编译通过:零警告(仅 coco 子模块 `.S` 文件 linker 提示,不影响功能)
- 142 个单元测试全部通过 ✓
- 80 项集成测试全部通过 ✓(新增中间件相关测试项)
- 提交并推送 `90b0388`
- 2026-06-07 21:00: **维护检查** — 项目处于暂停状态,执行编译与测试验证
- 编译通过:零警告(仅 coco 子模块 `.S` 文件 linker 提示,不影响功能)
- 142 个单元测试全部通过 ✓
- 80 项集成测试全部通过 ✓
- 代码无改动,.cocoon-plan.md 记录更新
- 2026-06-07 18:00: **维护检查** — 项目处于暂停状态,执行编译与测试验证
- 编译通过:零警告(仅 coco 子模块 `.S` 文件 linker 提示,不影响功能)
- 142 个单元测试全部通过 ✓
- 80 项集成测试全部通过 ✓
- 代码无改动,.cocoon-plan.md 记录更新
- 2026-06-07 15:00: **维护检查** — 项目处于暂停状态,执行编译与测试验证
- 编译通过:零警告(仅 coco 子模块 `.S` 文件 linker 提示,不影响功能)
- 142 个单元测试全部通过 ✓
- 80 项集成测试全部通过 ✓
- 代码无改动,无需提交
- 2026-06-07 12:00: **项目暂停** — 用户指示停止 cocoon 新功能开发,核心任务转向 ephemeral 软件引擎。本轮 cron 执行仅更新计划文件,未新增代码。项目所有功能保持可用,编译和测试全部通过。
- 2026-06-07: **本轮行动 — 为 config.c、log.c、tls.c 添加函数级 Doxygen 注释**
- `config.c`: 为 JSON 解析器内部函数parser_init、parser_skip_ws、parser_next_token、token_expect、token_str_dup、token_to_long、str_to_log_level和公共 APIconfig_load_from_file、config_merge添加完整 Doxygen 注释
- `log.c`: 为日志级别转换和输出函数level_str、log_set_level、log_set_prefix、log_get_level、log_output、log_error、log_warn、log_info、log_debug添加注释
- `tls.c`: 为 TLS 连接管理tls_lookup、tls_map_set、tls_map_clear、Memory BIO 操作socket_read、socket_write_all、flush_wbio、ALPN 回调tls_alpn_select_cb和公共 APItls_create_context、tls_destroy_context、tls_has_context、tls_accept、tls_read、tls_write、tls_close、tls_has_connection、tls_negotiated_http2添加注释
- `http2.c`: 移除过时的 TODO 占位注释(请求体收集已实现)
- 编译零警告142 个单元测试 + 80 项集成测试全部通过
- 推送到 main9da9bd9
- 2026-06-07: **本轮行动 — 修复编译警告与测试清理**
- `config.c`: 将 `strncpy` 替换为 `memcpy` + 显式 null 结尾,消除 `-Wstringop-truncation` 警告
- `proxy.c`: 同上,修复 `proxy_add_rule` 中的 `strncpy` 警告
- `tests/integration_test.sh`: 修复 `kill_server` 函数,补充 `pgrep -f "cocoon.*-c "` 以清理通过 `-c` 配置文件启动的测试服务器进程,解决端口占用导致测试失败的问题
- 编译零警告142 个单元测试 + 80 项集成测试全部通过
- 推送到 main1b930aa
- 2026-06-07: **本轮行动 — 反向代理支持MVP**
- `proxy.h` / `proxy.c`:新增反向代理模块
- `cocoon_proxy_rule_t` / `cocoon_proxy_config_t`:路径前缀匹配规则(最多 8 条)
- `proxy_init()` / `proxy_add_rule()`:解析 URL`http://host:port/path`),提取 host / port / path / https 标志
- `proxy_match()`:根据路径前缀查找匹配规则
- `proxy_forward()`:连接后端(`gethostbyname` + `socket` + `connect`),流式转发 HTTP/1.1 请求 + 响应
- 透传头Host、X-Forwarded-For、X-Forwarded-Proto、Content-Type、Content-Length
- 目前不支持 HTTPS 后端(运行时拒绝并警告)
- `cocoon.h`:新增 `COCOON_MAX_PROXY_RULES = 8``cocoon_config_t` 添加 `proxies[8]``num_proxies`
- `config.c`JSON 解析器新增 `proxies` 数组解析(对象项含 `prefix``target` 字符串)
- `server.c`
- `connection_t` 新增 `server_context_t *ctx` 指针,用于 `handle_request()` 访问代理配置
- `accept_loop()` 中设置 `conn->ctx = ctx`
- `server_create()` 中初始化代理规则(从配置加载)
- `handle_request()` 中在静态文件服务之前检查代理规则,匹配时调用 `proxy_forward()`
- `Makefile``proxy.c` 加入 `SRCS``test_server` 编译规则
- `cocoon.json`:示例配置添加 `"proxies": [{"prefix": "/api", "target": "http://localhost:3000"}]`
- `tests/integration_test.sh`:新增 3 项反向代理集成测试(代理 GET 200、响应体包含后端内容、非代理路径静态文件正常
- 编译通过零警告142 个单元测试 + 80 项集成测试全部通过
- 推送到 main
- 2026-06-07: **本轮行动 — HTTP/2 POST 请求体支持**
- `on_data_chunk_recv_callback`: 实现请求体收集,将 DATA 帧数据追加到 `stream->request.body`
- `on_frame_recv_callback`: 根据请求方法选择处理方式GET/HEAD → `http2_serve_static`POST → `http2_serve_post`
- `http2_serve_post`: 新增函数,处理 HTTP/2 POST 请求
- 支持 multipart/form-data 文件上传(保存到 root_dir/uploads/
- 支持 application/json 和 x-www-form-urlencoded 回显
- 构建 JSON 响应并通过 nghttp2 发送
- 包含 `multipart.h``platform.h``http2.c`
- 全部 142 个单元测试 + 77 项集成测试通过,编译零警告
- 推送到 main
- 2026-06-06: **本轮行动 — WebSocket 空闲超时 + 跨平台 poll/select 抽象**
- `platform.h` / `platform.c`: 新增 `cocoon_socket_poll_readable()` 跨平台 socket 可读等待
- POSIX: `poll()` + `POLLIN`
- Windows: `select()` + `fd_set`readfds
- `websocket.c`: `ws_handle_connection()` 实现 `timeout_ms` 空闲超时处理
- 每次循环前调用 `cocoon_socket_poll_readable()` 等待数据或超时
- 超时时发送 `1001 Idle timeout` 关闭帧,清理连接资源
- 解决 TODO: `/* TODO: 超时处理 */`
- `tests/websocket_test.py`: 新增 `test_timeout()` 测试Python 标准库,零依赖)
- 连接后不发帧,验证服务端 2 秒后发送 1001 关闭帧
- `tests/integration_test.sh`: 新增 WebSocket 空闲超时集成测试(启动 `-o 2000` 短超时服务器)
- `Makefile`: 补全 `test_websocket` 单元测试编译规则,加入 `platform.c`(修复 undefined reference
- 全部 142 个单元测试 + 77 项集成测试通过,编译零警告
- 推送到 main待提交
- 2026-06-06: **本轮行动 — 基础设施完善Makefile + CI + README**
- `Makefile`: 添加 `integration-test` 别名和 `test-all` 目标(一键运行全部测试)
- `.github/workflows/ci.yml`: GitHub Actions 工作流push/PR 时自动编译 + 单元测试 + 集成测试
- `README.md`: 同步项目现状,添加 CI badge、补充全部新特性与模块说明
- 编译零警告142 个单元测试 + 77 项集成测试全部通过
- 推送到 main87f89f5 → b0ae0f7 → 068ab7d
- 2026-06-06: **本轮行动 — 插件热重载支持SIGUSR1**
- `plugin.c` / `plugin.h`: 新增 `cocoon_plugin_reload()` API自动存储已加载插件路径
- 热重载流程:卸载所有插件 → 按存储路径重新加载 → 日志输出成功/失败数量
- `main.c`: 注册 SIGUSR1 信号处理器,收到信号后触发 `cocoon_plugin_reload()`
- `--help` 新增 Signals 说明文档
- 集成测试:新增 2 项热重载测试SIGUSR1 后 HTTP 200 验证 + 热重载日志验证)
- 全部 142 个单元测试 + 77 项集成测试通过,编译零警告
- 推送到 main80385d9
- 2026-06-06: **本轮行动 — 健康检查端点 /_health**
- `server.c`:新增 `/_health` 路由,返回 JSON 服务器状态
- 包含uptime_seconds、connections.active/max、plugins.count/list、middleware.count/names
- `middleware.c` / `middleware.h`:新增 `cocoon_middleware_list()` 查询 API
- 集成测试:新增 7 项测试(状态码 200、JSON 字段验证、HEAD 支持、路径遍历防护)
- 全部 142 个单元测试 + 75 项集成测试通过,编译零警告
- 推送到 main09e592d
- 2026-06-06: **本轮行动 — 插件配置数组支持 + 杂项修复**
- `config.c`:极简 JSON 解析器新增 `[`/`]` token 类型,支持字符串数组解析
- `plugins` 字段向后兼容单字符串 `"plugins.so"`,向前支持数组 `["a.so", "b.so"]`
- `.gitignore`:补全遗漏的 `tests/unit/test_websocket` 二进制
- `Makefile`:补全 `test_log` 单元测试编译规则(缺失导致 `make unit-test` 失败)
- `cocoon.json`:示例配置改为数组格式 `"plugins": ["plugins/hello.so"]`
- `test_config.c`:新增 3 项测试(`test_load_plugins_string``test_load_plugins_array``test_load_plugins_array_multiple`
- 全部 142 个单元测试 + 68 项集成测试通过,编译零警告
- 推送到 main2dc29d0
- 2026-06-06: **本轮行动 — 添加 WebSocket 单元测试**
- 新增 `tests/unit/test_websocket.c`12 项 WebSocket 协议单元测试
- 覆盖:帧解析(文本/二进制/关闭/空负载、掩码解掩码、16位/64位长度、帧编码文本/关闭/ping/pong、握手验证Sec-WebSocket-Accept、粘包多帧解析、64KB 大负载、空负载边界
- 使用 socketpair 创建内部通信管道,无需真实网络依赖
- 全部 12 项测试通过139 个单元测试 + 68 项集成测试全部通过
- 推送到 mainfaedbd5
- 2026-06-06: **本轮行动 — 实现动态插件系统Phase 4 MVP**
- 新增 `tests/unit/test_websocket.c`12 项 WebSocket 协议单元测试
- 覆盖:帧解析(文本/二进制/关闭/空负载、掩码解掩码、16位/64位长度、帧编码文本/关闭/ping/pong、握手验证Sec-WebSocket-Accept、粘包多帧解析、64KB 大负载、空负载边界
- 使用 socketpair 创建内部通信管道,无需真实网络依赖
- 全部 12 项测试通过139 个单元测试 + 68 项集成测试全部通过
- 推送到 mainfaedbd5
- 2026-06-06: **本轮行动 — 实现动态插件系统Phase 4 MVP**
- `plugin.h` / `plugin.c`:基于 dlopen/dlsym 的插件加载器最多8个插件逆序卸载
- 插件接口:`cocoon_plugin_init()`(初始化)、`cocoon_plugin_shutdown()`(清理)、`cocoon_plugin_version()`(版本)
- 插件通过 `cocoon_middleware_register()` 注册中间件参与请求处理
- 命令行:`--plugin <path>` 可多次指定
- 配置文件:`plugins` 字段支持字符串路径(单插件,数组支持待扩展)
- `server.c`:在 `server_create()` 中加载插件,`server_destroy()` 中逆序卸载
- `plugins/hello.c`:示例插件,演示中间件注册/注销/版本返回
- `Makefile`:添加 `plugin.c``-ldl` 链接选项
- `cocoon.json`:示例配置添加 `"plugins": "plugins/hello.so"`
- `.gitignore`:排除 `plugins/*.so``www/uploads/`
- 集成测试68项全部通过新增插件加载+日志验证2项
- 单元测试139个全部通过
- 编译零警告,推送到 main952cc66
- 2026-06-06: **本轮行动 — 中间件框架CORS / Basic Auth / Rate Limit**
- `middleware.c` / `middleware.h`:注册表(最多 16 个)+ 链式执行 + 短路机制
- CORS 中间件OPTIONS 预检 204 + 跨域响应头Access-Control-Allow-Origin/Methods/Headers
- Basic Auth 中间件HTTP 基础认证Base64 解码401 Unauthorized + WWW-Authenticate 头
- Rate Limit 中间件:基于 IP 秒级限流哈希表256 桶429 Too Many Requests
- `config.c` / `config.h`:新增 `cors_enabled` / `auth_user` / `auth_pass` / `rate_limit` 字段
- `main.c`:新增 `--cors` / `--auth-user` / `--auth-pass` / `--rate-limit` CLI 选项;修复 `access_log_path` 未初始化段错误
- `server.c`:集成 `cocoon_middleware_init_builtin()``server_create()` 中初始化;修复 `server_destroy``main()` 双重释放字符串指针;新增 `mw_config` 字段避免栈变量悬空
- 修复 `rate_limit_hash`:仅使用 IP 地址计算哈希,排除端口,避免同一 IP 不同 bucket
- 修复 401/429 响应 Content-Length与 body 长度严格匹配,避免 curl 挂起等待
- 集成测试66 项全部通过(新增 CORS/Basic Auth/Rate Limit 5 项测试)
- 单元测试127 个全部通过(修复 `test_config.c``config_merge` 参数不匹配)
- 编译零警告,推送到 maindd41464
- 2026-06-05: **本轮行动 — WebSocket 广播/频道路由系统**
- `websocket.c`:新增全局连接注册表(链表 + pthread_mutex + 原子计数)
- `ws_registry_add/remove`: 连接自动注册/注销
- `ws_broadcast()`: 向所有活跃连接广播文本消息
- `ws_broadcast_to_path()`: 按握手路径(如 `/ws/chat`)定向广播
- `ws_connection_count()`: 获取当前连接数
- `ws_handle_connection()` 新增 `path` 参数,用于频道标识
- `server.c`:修改调用处,传入 `req.path` 作为频道
- `websocket.h`:新增广播 API 声明
- 编译零警告61 项集成测试 + 127 个单元测试全部通过
- 提交:`fix(coco)` 修正子模块 + `feat(websocket)` 广播系统
- 2026-06-05: **本轮行动 — 实现 WebSocket 支持RFC 6455**
- 新增 `websocket.h` / `websocket.c`WebSocket 协议完整实现
- 帧解析:支持 FIN、opcode、payload length7/16/64 位、mask 解掩码
- 帧编码:服务器端发送(无掩码),支持文本/二进制/close/ping/pong
- 握手Sec-WebSocket-Key + SHA1 + Base64 计算 Accept
- `server.c`:添加 `is_websocket_upgrade_request()` 检测,握手后进入 `ws_handle_connection()`
- 连接处理:文本/二进制 echo、ping/pong 自动响应、close 帧处理
- 集成测试:`tests/websocket_test.py`Python 标准库,零依赖)
- 编译通过,零警告
- **61 项集成测试全部通过127 个单元测试全部通过**
- 推送到 main2775033
- 2026-06-05: **本轮行动 — 访问日志Nginx combined 格式)**
- 新增 `access_log.c` / `access_log.h`Nginx combined 格式访问日志线程安全pthread_mutex
- `cocoon.h`:新增 `access_log_path` 配置字段
- `config.c` / `config.h`JSON 配置和命令行参数支持 `access_log`
- `main.c`:新增 `--access-log <path>` CLI 选项,`-` 表示输出到 stdout
- `server.c`:扩展 `connection_t` 结构体,添加 `client_addr` / `addr_len` / `response_status`
- `server.c``handle_request()` 中每个响应路径设置 `response_status`,请求结束时调用 `access_log_write()`
- `server.c``accept_loop()` 将客户端地址复制到连接上下文
- `Makefile`:加入 `access_log.c`,更新单元测试编译规则
- `cocoon.json`:示例配置添加 `"access_log": "-"`
- `tests/integration_test.sh`:新增 5 项访问日志测试
- 编译通过,零警告
- **59 项集成测试全部通过127 个单元测试全部通过**
- 推送到 main
- 2026-06-04: 其他历史记录...(省略)