xfy911
|
e9d7af80b8
|
feat(http2): HTTP/2 静态文件服务支持 gzip/brotli 压缩
- http2.c: 文件内容读取到内存后按需压缩(优先 brotli,回退 gzip)
- 响应头自动添加 content-encoding: br 或 gzip
- 不可压缩类型(图片等)跳过压缩
- 修复 curl 测试:添加 --compressed 自动解压
- 新增 4 项 HTTP/2 压缩集成测试(HTML/CSS/JS brotli、图片不压缩)
- 49 项集成测试全部通过,35 个单元测试全部通过
|
2026-06-04 16:15:29 +08:00 |
|
xfy911
|
2436218d3e
|
docs(plan): 整理 Phase 3 完成状态,HTTP/2 完全可用
|
2026-06-04 15:51:12 +08:00 |
|
xfy911
|
094ae103ee
|
feat(http2): 实现 HTTP/2 静态文件服务
- http2.c: 新增 http2_serve_static(),支持 GET/HEAD 请求
- 支持 304 缓存协商(If-None-Match / If-Modified-Since)
- 支持目录转 index.html、路径遍历防护
- 使用 nghttp2_data_provider 发送文件内容
- server.c: 创建 HTTP/2 会话后设置上下文(root_dir、压缩配置)
- 新增 6 项 HTTP/2 集成测试(ALPN 协商、GET/HEAD/404、缓存)
- 45 项集成测试 + 35 单元测试全部通过
|
2026-06-04 15:50:22 +08:00 |
|
xfy911
|
88c6597748
|
docs(plan): 更新 HTTP/2 完成状态,调整待办优先级
|
2026-06-04 15:47:16 +08:00 |
|
xfy911
|
22c9f74e76
|
feat(http2): 实现 HTTP/2 静态文件服务,修复 ALPN 协商与 send_callback 返回值
主要变更:
- http2.c: 实现完整的 HTTP/2 静态文件服务(GET/HEAD、路径安全、ETag、304 缓存)
- http2.c: 修复 :path 伪头长度解析 bug(4→5)和路径空终止问题
- http2.c: 修复 send_callback 返回值 bug(send_all 返回 0 而非已发送字节数)
- http2.c: 添加 If-None-Match / If-Modified-Since 缓存头解析
- http2.h: 扩展 http2_session_t 结构体,添加 root_dir/gzip/brotli 字段
- http2.h: 新增 http2_session_set_context() 接口
- server.c: 在 handle_http2() 中调用 set_context 传入连接配置
- tls.c: 实现 ALPN 选择回调,优先协商 h2 次选 http/1.1
- tls.c: 修正 ALPN 协议格式解析(长度前缀字符串序列)
- tests/integration_test.sh: 新增 6 项 HTTP/2 集成测试(ALPN、GET、HEAD、404、缓存)
集成测试:45 项全部通过(新增 6 项 HTTP/2 测试)
单元测试:127 项全部通过
|
2026-06-04 15:45:16 +08:00 |
|
xfy911
|
832ff3dbf6
|
docs(plan): 更新 HTTP/2 完成状态,调整待办优先级
|
2026-06-04 14:44:55 +08:00 |
|
xfy911
|
bc7505dc02
|
feat(http2): 集成 HTTP/2 到服务器主循环
- server.c: 添加 handle_http2() 函数,在 client_handler 中检测 HTTP/2 连接
- TLS ALPN 协商后自动创建 HTTP/2 会话
- HTTP/2 连接走独立处理路径(handle_http2),支持帧读写
- 连接清理时销毁 HTTP/2 会话
- tls.c: 新增 tls_negotiated_http2(),检查 ALPN 是否协商为 h2
- tls.h: 添加 tls_negotiated_http2() 声明
- 编译通过,39 项集成测试 + 127 单元测试全部通过
|
2026-06-04 14:43:39 +08:00 |
|
xfy911
|
42879cdafd
|
docs(plan): 记录 HTTP/2 骨架完成状态
|
2026-06-04 14:40:27 +08:00 |
|
xfy911
|
6bb9635b2d
|
feat(http2): 添加 HTTP/2 支持骨架(nghttp2)
- 新增 http2.c / http2.h:基于 nghttp2 的 HTTP/2 会话管理
- 支持 TLS ALPN 协商和明文 h2c 升级
- 流级请求/响应处理,集成现有 http_request_t 结构
- 编译通过,链接 -lnghttp2
- Makefile 更新:包含 http2.c 和 nghttp2 库链接
- 待完成:server.c 集成(ALPN 协商、h2c 升级检测)
|
2026-06-04 14:40:02 +08:00 |
|
xfy911
|
cffb433c1e
|
docs(plan): 更新 TLS/HTTPS 完成状态,调整待办优先级
|
2026-06-04 14:36:16 +08:00 |
|
xfy911
|
7747ec921f
|
feat(tls): 添加 TLS/HTTPS 支持
- 新增 tls.c/tls.h,使用 OpenSSL Memory BIO 与 coco 协程 I/O 集成
- 支持 TLS 1.2+,通过命令行 --cert/--key 或配置文件启用
- 所有静态文件、目录浏览、POST/文件上传功能均已支持 HTTPS
- 集成测试新增 TLS 握手 + HTTPS 响应验证
- 单元测试 127 项通过,集成测试 39 项通过
|
2026-06-04 12:50:28 +08:00 |
|
xfy911
|
8f9d420447
|
docs(plan): 更新发展规划,记录本轮测试扩展
- 单元测试总数:125 个(server 从 5→17)
- 更新待办池优先级和状态
|
2026-06-04 09:04:54 +08:00 |
|
xfy911
|
4a979a105f
|
fix(api): 修正 COCOONForbidden 为 COCOON_FORBIDDEN
test(server): 扩展 server 单元测试覆盖(17个测试)
- 修复 cocoon.h 中 COCOONForbidden 拼写错误,统一为 COCOON_FORBIDDEN
- 新增 server 测试:
- 空 root_dir 边界测试
- port=0 和 port=65535 边界测试
- 多线程配置测试
- workers=0 自动检测测试
- timeout 和 max_connections 配置测试
- gzip/brotli 压缩标志测试
- stop_then_destroy 生命周期测试
- 多实例创建测试
- server_start NULL 参数测试
- 单元测试总数:125 个(server 从 5→17)
- 集成测试 37 项全部通过
|
2026-06-04 09:03:55 +08:00 |
|
xfy(claw)
|
9041d8dfc4
|
Merge pull request #1 from xfy911/feature/windows-compat
docs(plan): 添加 Windows 兼容性任务及详细技术方案
|
2026-06-04 08:17:40 +08:00 |
|
|
|
ca7b33aa10
|
docs(plan): 添加 Windows 兼容性详细技术方案
- 描述目标:在 Windows 上编译运行 cocoon
- 分析核心发现:coco 库已有 Windows 支持,问题在 cocoon 的 POSIX 依赖
- 提出方案:引入 platform.h + platform.c 平台抽象层
- 列出关键 API 映射:POSIX → Windows 对照表
- 记录零拷贝策略:Windows 暂时回退到 read+send,后续用 TransmitFile 优化
- 指定执行方式:Subagent-Driven 逐个 Task 实现
|
2026-06-04 08:16:27 +08:00 |
|
|
|
0fd5ebc043
|
docs(plan): 在待办池中添加 Windows 兼容性任务
将 Windows 兼容性标记为 [高] 优先级,插入到待办池首位。
当前 cocoon 仅支持 Linux/macOS,Windows 支持是重要演进方向。
|
2026-06-04 08:16:11 +08:00 |
|
xfy911
|
ea5436febb
|
feat(compression): 添加 Brotli 压缩支持,优先于 Gzip
- static.c: 新增 brotli_compress(),使用 libbrotlienc(质量 11,窗口 22)
- static_serve_file(): 优先 Brotli,回退 Gzip,二进制文件跳过
- http.c: 解析 Accept-Encoding: br,http_request_t 新增 accept_brotli
- cocoon.h: cocoon_config_t 新增 brotli_enabled(默认 true)
- config.c/h: 解析 brotli_enabled JSON 字段,config_merge() 新增 has_brotli_enabled
- main.c: --no-brotli 命令行选项
- server.c: 连接结构体新增 brotli_enabled
- Makefile: 链接 -lbrotlienc
- 单元测试: test_static.c 新增 4 个 Brotli 测试;test_config.c 新增 brotli 配置测试
- 集成测试: 新增 5 项 Brotli 测试(br 压缩、优先策略、图片不压缩)
- cocoon.json: 添加 brotli_enabled 字段
- README: 更新特性描述、curl 示例、命令行参数、路线图
- 113 个单元测试全部通过,37 项集成测试全部通过
|
2026-06-04 06:19:42 +08:00 |
|
xfy911
|
3801f3ac0d
|
feat(config): 添加 JSON 配置文件支持 + gzip_enabled 控制 + README 修正
- config.c/config.h: 极简 JSON 解析器,支持数字/字符串/布尔//注释
- cocoon_config_t 新增 gzip_enabled 字段(默认 true)
- main.c: -c <file> 加载配置,--no-gzip 禁用压缩,命令行覆盖配置
- 修复 -r 参数 strdup 崩溃(避免 free 野指针)
- 修复 signal handler 双重 free 问题
- 单元测试: test_config.c 17 个测试全部通过
- 集成测试: 32 项全部通过
- README 修正过时描述(配置方式、安全设计、-v 说明)
|
2026-06-04 03:14:32 +08:00 |
|
xfy911
|
c036615d58
|
chore: 添加 test_server 到 gitignore + 更新待办池
- .gitignore: 补充 tests/unit/test_server,避免误提交编译产物
- .cocoon-plan.md: 新增 signal handler cleanup bug 和中文注释完善到待办池
|
2026-06-04 00:29:31 +08:00 |
|
xfy911
|
fb457e35ec
|
test(server): 新增服务器核心 null 安全与生命周期测试
- test_create_null_config: NULL config 返回 NULL
- test_create_null_root_dir: 无 root_dir 提前返回 NULL
- test_stop_null / test_destroy_null: NULL 指针不 crash
- test_create_and_destroy: 正常创建+停止+销毁生命周期(高位端口避免冲突)
- Makefile: 添加 test_server 编译规则,链接全部依赖 + libcoco
|
2026-06-04 00:26:29 +08:00 |
|
xfy911
|
19c97ae6a9
|
test(config): 补充边界与异常路径测试
- test_load_invalid_field_type: 字段类型非法(port 为字符串),验证不 crash
- test_load_log_level_invalid: 非法 log_level 值保持默认 INFO
- test_load_nested_ignored: 嵌套对象——极简解析器返回 false 但不 crash
- test_load_array_ignored: 数组——同上,不 crash 即可
- test_merge_cmdline_null_root_dir: cmdline root_dir 为 NULL 时不覆盖 base
|
2026-06-04 00:24:29 +08:00 |
|
xfy911
|
c78086f2e5
|
test(log): 补充日志输出过滤与调用稳定性测试
- test_log_calls_no_crash: 直接调用 log_error/warn/info/debug 确认不崩溃
- test_log_level_filter: 用 pipe 重定向 stderr,验证 ERROR 级别下 INFO 被过滤、ERROR 正常输出
- 修复缺失 string.h 头文件警告
|
2026-06-04 00:23:10 +08:00 |
|
xfy911
|
e5bfc75d98
|
chore: 删除误提交的编译产物
- tests/unit/test_{config,http,log,static} 是编译生成的二进制文件
- 不应纳入版本控制,已通过 .gitignore 规避
|
2026-06-04 00:18:36 +08:00 |
|
xfy911
|
763e46d493
|
test(integration): 新增 POST/multipart 端到端测试
- 新增 curl 测试:multipart 文件上传、JSON 回显、表单回显
- 验证 uploads/ 目录创建和文件保存
- 补充现有测试的覆盖范围
|
2026-06-04 00:18:31 +08:00 |
|
xfy911
|
df8707ea69
|
test(multipart): 新增 multipart 解析单元测试
- test_multipart.c (Unity 框架):
- test_extract_boundary: 提取带引号和不带引号的 boundary
- test_parse_simple: 单文件上传解析
- test_parse_multi: 多字段混合(文件 + 普通字段)
- test_parse_empty: 空 body / 无效 boundary 的错误处理
- 覆盖正常/异常路径,验证内存正确释放
|
2026-06-04 00:18:25 +08:00 |
|
xfy911
|
8ee487f64d
|
feat(multipart): 新增 multipart/form-data 解析模块
- multipart.h: 定义 multipart_part_t 结构体 + parse/extract_boundary/free API
- multipart.c: 轻量级解析器实现
- find_line_end: 查找行尾(\n 或文件尾)
- parse_content_disposition: 解析 name/filename 字段
- multipart_parse: 两阶段解析(先计数再提取),跳过 preamble
- multipart_extract_boundary: 从 Content-Type 提取 boundary 值
- multipart_parts_free: 释放所有分配的字段内存
- 零外部依赖,仅使用标准库
|
2026-06-04 00:18:09 +08:00 |
|
xfy911
|
0d8c36ef25
|
build: 统一 _GNU_SOURCE 宏定义到 Makefile
- config.c/http.c/static.c/server.c: 移除各自的 #define _GNU_SOURCE
- Makefile CFLAGS: 添加 -D_GNU_SOURCE,保证所有翻译单元一致
- 避免重复定义,减少源文件样板代码
|
2026-06-04 00:17:55 +08:00 |
|
xfy911
|
252530dfe7
|
deps: upgrade coco submodule to v2.1.0
升级 upstream DefectingCat/coco 到 v2.1.0,包含 shared-stack 热槽管理、LRU 驱逐、工作窃取迁移等特性。
适配结果:
- API 完全向后兼容,零代码改动编译通过
- 核心功能验证正常:HTTP 服务、Gzip 压缩、缓存协商
- 新增文件 config.c / multipart.c 在新版本上同样零改动编译
Submodule: 7d6e23e -> 62dbb13 (v2.1.0)
|
2026-06-04 00:12:00 +08:00 |
|
xfy911
|
3c521823b1
|
feat(tests): 添加 config 和 log 模块单元测试 + http.c 缓冲区溢出防护
- 新增 test_log.c: 8 个测试覆盖日志级别 getter/setter、前缀设置、持久化
- 新增 test_config.c: 11 个测试覆盖 JSON 配置加载、注释支持、错误处理、merge 覆盖逻辑
- http.c: 修复 response header 格式化中的 snprintf 边界条件,防止缓冲区溢出
- Makefile: 添加 test_log、test_config 编译规则,更新 .PHONY 列表
|
2026-06-04 00:02:18 +08:00 |
|
xfy911
|
d5b8782a1b
|
feat: 添加 Unity 单元测试框架
- 引入 Unity 测试框架 (ThrowTheSwitch)
- 创建 test_http.c (35 个测试): 请求解析、响应格式化、MIME 类型、内存管理
- 创建 test_static.c (31 个测试): 压缩判断、时间处理、ETag、路径安全、HTML 转义、gzip、socket 层
- 更新 Makefile: make unit-test 一键编译运行
- 66 个测试全部通过,集成测试保持 30 项通过
|
2026-06-03 23:53:22 +08:00 |
|
xfy911
|
bbc45d0735
|
feat(post): 添加 POST 请求体解析支持
- http_request_t 新增 body / body_len / content_type 字段
- http.c 解析 Content-Type 头,新增 http_request_free 释放 body
- server.c 新增 conn_read_body 从 socket 读取请求体(8MB 上限)
- server.c 新增 handle_post_request 返回 JSON 回显
- 支持 application/json 直接回显
- 支持 application/x-www-form-urlencoded 字符串回显
- 其他类型返回基本信息
- 8MB 请求体上限(HTTP_MAX_BODY),超限返回 413
- 集成测试新增 3 项 POST 测试:JSON 回显、表单回显、PUT 405
- 30 项测试全部通过
- README 更新:添加 POST 特性、curl 示例、路线图更新
- send_all 从 static 改为全局可见,供 server.c 复用
Phase 2 全部完成:缓存/超时/日志/gzip/测试/压测/POST
|
2026-06-03 21:24:03 +08:00 |
|
xfy911
|
b6beb8bb9c
|
feat(tests): 添加集成测试套件 + 性能基准 + 更新文档
- 新增 tests/ 目录:
- integration_test.sh: 27 项 curl/bash 集成测试(GET/HEAD/404/Range/304/gzip/MIME/目录浏览/路径防护)
- benchmark.sh: wrk 压测脚本,支持单线程和多线程模式
- fixtures/: 测试用静态资源(HTML/CSS/JS/JSON/PNG)
- Makefile 新增 test / bench 快捷目标
- README 全面更新:
- 补充 Gzip/缓存/超时/日志等已实现特性
- 更新命令行参数(-m/-o/-l/-v)
- 添加性能基准表格(~16K RPS / ~60μs 延迟)
- 路线图标记已完成项
- .cocoon-plan.md 更新 Phase 2 进度
|
2026-06-03 21:15:05 +08:00 |
|
xfy911
|
e482e52658
|
docs(plan): 更新 Phase 2 进度 — gzip 压缩已完成 + 压测数据
- 标记 gzip 压缩为已完成(3086B → 1282B,压缩率 41%)
- 记录单线程压测数据:15K RPS,64us 平均延迟,47MB/s 传输
|
2026-06-03 18:19:57 +08:00 |
|
xfy911
|
0a71365fac
|
docs(plan): 更新 Phase 2 进度 — 超时/日志已完成,gzip 待集成
|
2026-06-03 18:19:23 +08:00 |
|
xfy911
|
5adf5e0581
|
fix(build): 修复 Range 解析嵌套问题 + 补充 errno 头文件 + 链接 zlib
- http.c: 修复 Range 请求解析被错误嵌套在 accept-encoding 分支的 bug
- static.c: 补充缺失的 <errno.h> 和 <zlib.h> 头文件,修复编译失败
- Makefile: 添加 -lz 链接参数,支持 gzip 压缩功能
|
2026-06-03 18:18:33 +08:00 |
|
xfy911
|
0dc2bb5b4e
|
feat(server): 连接空闲超时 + 最大并发限制 + 分级日志
- 新增 log.c/log.h 分级日志系统(error/warn/info/debug)
- 新增连接空闲超时管理:使用 coco_timer + shutdown + coco_cancel
自动清理长时间无数据的僵尸连接,默认 30 秒
- 新增最大并发连接数限制(-m <num>),超限返回 503
- 命令行新增选项:-m 最大连接数, -o 超时毫秒, -l 日志级别
- 替换所有 printf 为 log_info/log_error/log_debug 等分级输出
- 编译通过,单线程/多线程模式均正常
|
2026-06-03 18:13:29 +08:00 |
|
xfy911
|
6b2d046548
|
chore(submodule): coco 改为 git submodule,更新构建流程
- 将 coco 作为 git submodule 引入(xfy911/coco fork)
- Makefile: 默认路径改为 coco/(submodule 目录),支持 COCO_DIR 覆盖
- Makefile: 新增 deps / build-all 目标,自动构建 coco 依赖
- README: 更新构建说明,添加 --recursive clone 和 submodule 初始化步骤
|
2026-06-03 17:46:37 +08:00 |
|
xfy911
|
d6cbf5a3e3
|
deps: add xfy911/coco as git submodule (fork with fixes)
|
2026-06-03 17:44:52 +08:00 |
|
xfy911
|
37c2dbc69f
|
deps: add coco as git submodule
|
2026-06-03 17:43:06 +08:00 |
|
xfy911
|
aebacc26ef
|
docs(plan): 更新进度 — HTTP 缓存已完成
|
2026-06-03 17:38:59 +08:00 |
|
xfy911
|
f5563381b8
|
feat(cache): 实现 HTTP 缓存协商(ETag + Last-Modified + 304)
- static: 添加 format_http_time / generate_etag / match_etag / parse_http_time 辅助函数
- static: 静态文件服务生成 ETag(文件大小+修改时间)和 Last-Modified
- static: 实现 If-None-Match 和 If-Modified-Since 缓存协商,命中时返回 304 Not Modified
- http: 请求结构体添加 if_none_match / if_modified_since 字段
- http: 响应头格式化支持 ETag 和 Last-Modified 输出
- http: 重构响应头构建,先输出固定头再追加缓存头
测试验证:curl 带 If-None-Match / If-Modified-Since 均返回 304
|
2026-06-03 17:38:28 +08:00 |
|
xfy911
|
413288d837
|
feat(http): 添加缓存头部解析 + 修复编译警告
- http: 解析 If-None-Match 和 If-Modified-Since 请求头
- http: 响应结构体添加 etag 和 last_modified 字段
- server/static: 替换 strncpy 为 snprintf,消除 stringop-truncation 警告
- static: 修复 CSS 百分号转义(%%)
- static: 消除 unused parameter 警告
|
2026-06-03 17:30:37 +08:00 |
|
xfy911
|
a30fcf6ee1
|
docs(plan): 添加自主发展规划文件
|
2026-06-03 17:22:54 +08:00 |
|
xfy911
|
97e16cedd7
|
docs(readme): 完善项目文档
- 添加 Quick Start、依赖说明、构建指令
- 补充模块职责表、核心 API 速览、安全设计
- 添加路线图与性能数据
|
2026-06-03 16:56:40 +08:00 |
|
xfy911
|
250f336eff
|
fix(build): 修复编译错误与警告
- Makefile: 添加 -luring 链接(coco 内部使用 io_uring)
- static.c: 添加 #include <time.h> 和 _GNU_SOURCE 定义
- http.h: 添加 #include <stddef.h> 修复 size_t 未定义
- server.c: 删除未使用的 conn_write,修复 root_dir 传递
|
2026-06-03 16:55:48 +08:00 |
|
xfy911
|
804fa2b1fb
|
chore(examples): 添加示例首页
- 美观的响应式 HTML 展示页面
- 展示 Cocoon 三大特性:协程驱动、静态托管、多线程调度
|
2026-06-03 16:48:30 +08:00 |
|
xfy911
|
30aac764db
|
feat(main): 添加程序入口与命令行参数解析
- 支持 -r(根目录)、-p(端口)、-t(多线程)、-w(线程数)、-v(详细日志)
- SIGINT/SIGTERM 优雅关闭
- 自动打印使用说明
|
2026-06-03 16:48:24 +08:00 |
|
xfy911
|
da8fe6b545
|
feat(server): 实现基于 coco 协程的 TCP 服务器核心
- server_create/start/stop/destroy: 服务器生命周期管理
- accept_loop: 主 accept 循环(单线程/多线程模式)
- client_handler: 每个连接一个协程,支持 HTTP keep-alive
- conn_read/write: 协程安全的非阻塞 I/O 封装
- 支持多线程调度(coco_global_sched)
|
2026-06-03 16:47:40 +08:00 |
|
xfy911
|
d7b9c93e78
|
feat(static): 实现静态资源服务模块
- static_serve_file: 文件服务(sendfile 零拷贝 + Range 支持)
- static_serve_directory: 目录浏览(HTML 列表 + 文件大小/时间)
- static_send_error: HTTP 错误响应(400/403/404/416/500)
- safe_path_join: 路径遍历防护
|
2026-06-03 16:45:48 +08:00 |
|
xfy911
|
0ab3291035
|
feat(http): 实现 HTTP/1.1 请求解析与响应构建
- http_parse_request: 解析请求行 + 头部提取
- http_format_response_header: 格式化响应头(支持 Range)
- http_mime_type: 25+ 种常见 MIME 类型自动识别
|
2026-06-03 16:44:02 +08:00 |
|