cocoon/.cocoon-plan.md
xfy911 a93e9f32f5 feat(h2c): 添加明文 HTTP/2 升级支持
- server.c: 检测 PRI 魔术字直接连接 + Upgrade: h2c 协商
- server.c: 101 Switching Protocols 响应,正确会话生命周期管理
- http2.h/c: 新增 http2_session_upgrade() 注册 stream 1
- http2.c: 修复 nghttp2_session_upgrade2 head_request 参数误用
- tests: 新增 4 项 h2c 集成测试(prior knowledge、Upgrade、404)
- plan: 标记 h2c 完成,更新测试计数 52 项
2026-06-04 17:56:44 +08:00

134 lines
7.7 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] Gzip 压缩 ✅ 2026-06-03已接入响应流程
- [x] Brotli 压缩 ✅ 2026-06-04优先于 Gzip
- [x] 集成测试 suite45 项 curl/bash 测试全部通过)✅ 2026-06-04
- [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 框架127 个测试全部通过)
### 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 协商 + 静态文件服务 + 缓存)✅ 2026-06-04
- [x] **h2c 升级支持** — 明文 HTTP/2PRI 魔术字直接连接 + Upgrade: h2c 协商)✅ 2026-06-04
- [ ] Windows 兼容性
### Phase 4 — 生态
- [ ] WebSocket 支持
- [ ] 中间件机制
- [ ] 插件系统
## 当前状态
- 编译通过,零警告(除 coco 子模块的 linker .note.GNU-stack 提示)
- **52 项集成测试全部通过**(新增 4 项 h2c 测试prior knowledge、Upgrade 协商、404 ×2
- **35 个单元测试全部通过**Unity 框架)
- 压测数据wrk -t4 -c100 -d10s → 16,179 RPS平均延迟 59.86μs
- POST 支持JSON 和 form-urlencoded 回显multipart 文件上传Content-Length 解析8MB 上限
- **配置文件支持**JSON 格式8 个字段,命令行参数可覆盖
- **TLS/HTTPS**OpenSSL 3.0 Memory BIO + coco 协程集成自签名证书支持ALPN 协商 h2/http1.1
- **HTTP/2**
- 基于 nghttp2 的完整会话管理431 行)
- TLS ALPN 自动协商 h2
- 静态文件服务GET/HEAD、路径安全、ETag、304 Not Modified
- HEAD 请求正确处理(无 body
- 目录自动 fallback 到 index.html
- 路径遍历防护(.. 检查)
- gzip/brotli 压缩支持HTTP/2 响应中优先 brotli
- 文件内容通过 nghttp2_data_provider 流式传输
- 修复 send_callback 返回值 bugsend_all 返回 0 而非已发送字节数)
- 修复 :path 伪头长度解析 bug4→5和路径空终止问题
## 待办池
1. **[中] Windows 兼容性** — 平台抽象层platform.h / platform.csendfile 替代方案io_uring 替代方案
2. **[中] Doxygen 中文注释** — 所有模块的公共 API 需要完整文档http2.c 已部分完成)
3. **[低] 检查远程更新内容** — 上游有 new commits需 review 9041d8d
4. **[低] HTTP/2 目录浏览** — 目前返回 404可考虑支持目录列表
## 最近行动记录
- **2026-06-04: 本轮行动 — h2c 升级支持(明文 HTTP/2**
- server.c: 添加 h2c 检测逻辑PRI 魔术字 + Upgrade: h2c 协商)
- server.c: `is_h2c_upgrade_request()` 检查 Upgrade 和 Connection 头
- server.c: `send_h2c_upgrade_response()` 发送 101 Switching Protocols
- server.c: `client_handler` 循环中检测 h2c 前言和 Upgrade 请求,正确销毁会话(避免双重 free
- http2.h: 新增 `http2_session_upgrade()` 声明
- http2.c: 实现 `http2_session_upgrade()`,通过 `nghttp2_session_upgrade2` 注册 stream 1
- http2.c: 修复 `nghttp2_session_upgrade2` 第四个参数误用(`head_request` 而非 `stream_id`
- tests/integration_test.sh: 新增 4 项 h2c 集成测试prior knowledge、Upgrade 协商、404 ×2
- 编译通过,零警告
- **52 项集成测试全部通过35 个单元测试全部通过**
- 推送到 main
- http2.c: 实现完整的 HTTP/2 静态文件服务GET/HEAD、路径安全、ETag、304 缓存)
- http2.c: 修复 :path 伪头长度解析 bug4→5和路径空终止问题
- http2.c: 修复 send_callback 返回值 bugsend_all 返回 0 而非已发送字节数,导致 nghttp2 重试死循环)
- http2.c: 添加 If-None-Match / If-Modified-Since 缓存头解析到 nghttp2 头回调
- http2.h: 扩展 http2_session_t 结构体,添加 root_dir/gzip/brotli 字段
- http2.h: 新增 http2_session_set_context() 接口
- server.c: 在 handle_http2() 中调用 set_context 传入连接配置
- tls.c: 实现 ALPN 选择回调tls_alpn_select_cb优先协商 h2 次选 http/1.1
- tls.c: 修正 ALPN 协议格式解析(长度前缀字符串序列)
- tests/integration_test.sh: 新增 6 项 HTTP/2 集成测试ALPN 协商、GET、HEAD、404、缓存
- 编译通过,零警告(除 coco 子模块 linker 提示)
- 45 项集成测试全部通过127 个单元测试全部通过
- 推送到 main22c9f74
- **2026-06-04: 本轮行动 — HTTP/2 骨架 + server.c 集成**
- 新增 `http2.c` / `http2.h`:基于 nghttp2 的 HTTP/2 会话管理431 行)
- 修复编译:匹配 `http_request_t` 结构,使用 `log_error` 替代 `LOG_ERROR`
- server.c: 添加 `handle_http2()` 函数,在 `client_handler` 中检测 HTTP/2 连接
- TLS ALPN 协商后自动创建 HTTP/2 会话
- HTTP/2 连接走独立处理路径(帧读写循环)
- tls.c/tls.h: 新增 `tls_negotiated_http2()`,检查 ALPN 是否协商为 h2
- Makefile加入 `http2.c`、链接 `-lnghttp2`
- 编译通过39 项集成测试 + 127 单元测试全部通过
- 推送到 main
- **2026-06-04: 本轮行动 — 实现 TLS/HTTPS 支持**
- 新增 `tls.c` / `tls.h`OpenSSL 3.0 Memory BIO 与 coco 协程 I/O 集成
- `cocoon.h`:新增 `tls_enabled`, `tls_cert`, `tls_key` 配置字段
- `server.c`accept 后执行 TLS 握手,读/写/关闭路由到 TLS 层
- `static.c`TLS 连接降级 sendfile 为缓冲 read+write修复 lseek 定位(压缩读取后重置文件位置)
- `config.c` / `config.h`JSON 配置支持 `tls_cert`, `tls_key`, `tls_enabled`
- `main.c`:新增 `--cert`, `--key`, `--tls` CLI 选项
- `Makefile`:加入 `tls.c`,链接 `-lssl -lcrypto`
- 生成自签名测试证书 `tests/server.crt` / `tests/server.key`
- `tests/integration_test.sh`:新增 TLS 握手 + HTTPS 响应验证,修复 `kill_server` 匹配规则curl 添加 `--max-time``-k`
- `tests/unit/test_config.c`:更新 `config_merge` 测试签名
- 单元测试127 个通过1 忽略集成测试39 个通过(含 2 个 TLS 测试)
- 推送到 main
- 2026-06-04: 修复拼写错误 + 扩展 server 单元测试17 个)
- 2026-06-04: Brotli 压缩支持(优先于 Gzip
- 2026-06-04: 配置文件支持 + gzip_enabled 控制 + README 修正
- 2026-06-04: multipart 文件上传
- 2026-06-03: 项目初始化,核心模块全部实现
- 2026-06-03: 添加缓存协商ETag + Last-Modified + 304修复编译警告
- 2026-06-03: 添加连接空闲超时管理 + 最大并发限制 + 分级日志系统
- 2026-06-03: 创建集成测试套件 + 性能基准 + 更新文档
- 2026-06-03: 添加 POST 请求体解析支持30 项测试全部通过README 更新
- 2026-06-03: 单元测试框架Unity66 个测试全部通过)