cocoon/.cocoon-plan.md
xfy911 3ba9fcea62 feat(access_log): 实现 Nginx combined 格式访问日志
- 新增 access_log.c / access_log.h:Nginx combined 格式,线程安全
- cocoon.h / config.c / config.h:支持 access_log 配置字段
- main.c:新增 --access-log CLI 选项,'-' 表示 stdout
- server.c:connection_t 扩展 client_addr/addr_len/response_status
- server.c:handle_request 中记录 response_status 并调用 access_log_write
- Makefile:加入 access_log.c,更新单元测试编译规则
- cocoon.json:示例配置添加 access_log
- 集成测试:新增 5 项访问日志测试
- 59 项集成测试全部通过,35 个单元测试全部通过
2026-06-05 00:20:24 +08:00

162 lines
10 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] 集成测试 suite59 项 curl/bash 测试全部通过)✅ 2026-06-05
- [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
- [x] **HTTP/2 目录浏览** — 目录无 index.html 时返回目录列表 ✅ 2026-06-04
- [ ] Windows 兼容性
### Phase 4 — 生态
- [ ] WebSocket 支持
- [ ] 中间件机制
- [ ] 插件系统
## 当前状态
- 编译通过,零警告(除 coco 子模块的 linker .note.GNU-stack 提示)
- **59 项集成测试全部通过**(新增 5 项访问日志测试)
- **35 个单元测试全部通过**Unity 框架)
- 压测数据wrk -t4 -c100 -d10s → 16,179 RPS平均延迟 59.86μs
- POST 支持JSON 和 form-urlencoded 回显multipart 文件上传Content-Length 解析8MB 上限
- **配置文件支持**JSON 格式9 个字段(含 access_log命令行参数可覆盖
- **访问日志**Nginx combined 格式,支持文件路径或 stdout`-`线程安全pthread_mutex记录 User-Agent / Referer / 状态码
- **TLS/HTTPS**OpenSSL 3.0 Memory BIO + coco 协程集成自签名证书支持ALPN 协商 h2/http1.1
- **HTTP/2**完整功能静态文件服务、目录浏览、缓存协商、压缩、HEAD 请求)
- **h2c**:明文 HTTP/2 支持prior knowledge + Upgrade 协商)
## 待办池
1. **[中] Windows 兼容性** — 平台抽象层platform.h / platform.csendfile 替代方案io_uring 替代方案
2. **[中] Doxygen 中文注释** — http2.c 已完成其余模块tls.c, config.c, multipart.c 等)待补充
3. **[低] 检查远程更新内容** — 上游有 new commits需 review 9041d8d
## 最近行动记录
- **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 项访问日志测试日志生成、GET 记录、User-Agent、Referer、404 状态码)
- 编译通过,零警告
- **59 项集成测试全部通过35 个单元测试全部通过**
- 推送到 main
- **2026-06-04: 本轮行动 — http2.c 完整中文 Doxygen 注释**
- 为 http2.c 全部 29 个函数添加中文文档注释
- 会话管理模块init, cleanup, create, destroy, is_http2, get, set_context, upgrade
- 数据收发模块recv, send_pending, want_read, want_write
- nghttp2 回调send, begin_headers, header, frame_recv, stream_close, data_chunk
- 静态文件服务format_http_time, generate_etag, parse_http_time, match_etag, data_source_read, serve_directory, serve_static
- 连接处理on_connection_accepted
- 所有注释包含功能说明、参数说明、返回值说明
- 编译通过,零警告
- **54 项集成测试全部通过35 个单元测试全部通过**
- 推送到 maind0f3bb8
- **2026-06-04: 本轮行动 — HTTP/2 目录浏览支持**
- http2.c: 新增 `http2_serve_directory()` 函数,生成 HTML 目录列表页面
- http2.c: 在 `http2_serve_static()` 中检测目录无 index.html 时调用目录浏览
- http2.c: 目录浏览支持 HTML 转义、文件大小格式化、修改时间显示、上级目录链接
- http2.c: 目录浏览支持 HEAD 请求(不发送 body
- http2.c: 添加 `#include <dirent.h>` 头文件
- tests/integration_test.sh: 新增 2 项 HTTP/2 目录浏览集成测试HTTPS h2 + h2c
- 编译通过,零警告
- **54 项集成测试全部通过35 个单元测试全部通过**
- 推送到 main
- **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 个测试全部通过)