cocoon/.cocoon-plan.md

215 lines
15 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
- `config.c` / `config.h`:极简 JSON 解析器(数字、字符串、布尔、注释)
- `cocoon_config_t` 结构体root_dir / port / threaded / num_workers / max_connections / timeout_ms / log_level / gzip_enabled / brotli_enabled / access_log / cors_enabled / auth_user / auth_pass / rate_limit
- `config_merge()`:命令行参数覆盖配置文件
- `cocoon.json` 示例配置
- `--no-gzip` / `--no-brotli` 命令行选项禁用压缩
- [x] **Brotli 压缩** — 比 gzip 更高压缩率,现代浏览器均支持 ✅ 2026-06-04
- [x] **HTTPS / TLS** — OpenSSL Memory BIO 集成,支持命令行与配置文件启用 ✅ 2026-06-04
- [x] **HTTP/2** — nghttp2 完整实现TLS ALPN 协商 + 静态文件服务 + 缓存 + 目录浏览)✅ 2026-06-04
- [x] **h2c 升级支持** — 明文 HTTP/2PRI 魔术字直接连接 + Upgrade: h2c 协商)✅ 2026-06-04
- [x] **HTTP/2 目录浏览** — 目录无 index.html 时返回目录列表 ✅ 2026-06-04
- [x] **WebSocket 支持** — RFC 6455 握手 + 帧解析/编码 + echo 服务器 ✅ 2026-06-05
- [x] **Windows 兼容性** — 跨平台抽象层,支持 Linux/macOS/Windows(MinGW/MSVC) ✅ 2026-06-04
### Phase 4 — 生态
- [x] **WebSocket 广播/频道路由** — 全局连接注册表 + 广播/定向发送 API ✅ 2026-06-05
- [x] **中间件机制** — 注册表 + 链式执行,内置 CORS / Basic Auth / Rate Limit ✅ 2026-06-06
- [x] **插件系统** — 动态加载 .so/.dll 扩展 ✅ 2026-06-06MVPdlopen + 中间件注册 + 示例插件)
## 当前状态
- 所有 Phase 1-4 核心功能已完成
- 编译通过,零警告(除 coco 子模块的 linker .note.GNU-stack 提示)
- **142 个单元测试全部通过**Unity 框架,新增 12 项 WebSocket 测试)
- **75 项集成测试全部通过**(新增 7 项健康检查端点测试)
- 压测数据wrk -t4 -c100 -d10s → 16,179 RPS平均延迟 59.86μs单线程
- 多线程模式(-t -w 4已修复主线程 accept + pollclient_handler 1MB 协程栈)
- POST 支持JSON 和 form-urlencoded 回显multipart 文件上传Content-Length 解析8MB 上限
- 配置文件支持JSON 格式13 个字段,命令行参数可覆盖
- 访问日志Nginx combined 格式,支持文件路径或 stdout`-`线程安全pthread_mutex记录 User-Agent / Referer / 状态码
- TLS/HTTPSOpenSSL 3.0 Memory BIO + coco 协程集成自签名证书支持ALPN 协商 h2/http1.1
- HTTP/2完整功能静态文件服务、目录浏览、缓存协商、压缩、HEAD 请求)
- h2c明文 HTTP/2 支持prior knowledge + Upgrade 协商)
- WebSocketRFC 6455 握手、文本/二进制帧 echo、ping/pong/close、**广播/频道**
- Windows 兼容性:跨平台抽象层 platform.h + platform.cCMakeLists.txt 自动检测平台Makefile 在 Windows 下自动链接 ws2_32
## 待办池
1. **[低] Doxygen 中文注释** — 各模块函数级注释待完善
2. **[低] 性能优化** — 连接池复用、零拷贝优化、压缩预缓存
3. **[低] 配置文件 JSON Schema 验证** — 配置文件格式校验
4. **[x] 插件热重载** — 运行时 SIGUSR1 触发重新加载插件 ✅ 2026-06-06
5. **[x] CI 自动化** — GitHub Actions 编译 + 测试 ✅ 2026-06-06
6. **[x] Makefile 测试目标完善** — integration-test 别名 + test-all ✅ 2026-06-06
7. **[x] README 同步更新** — 补充所有新功能与 CI badge ✅ 2026-06-06
## 最近行动记录
- 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: 其他历史记录...(省略)