201 Commits

Author SHA1 Message Date
xfy911
2a5ce429db docs(plan): 更新维护检查记录 — 2026-06-07 18:00 2026-06-07 18:02:51 +08:00
xfy911
2fa7e538a8 docs(plan): 标记项目暂停,核心任务转向 ephemeral 2026-06-07 12:01:40 +08:00
xfy911
fd66e71f1a feat(sched): 接入 coco v2.2.0 新特性 — 热栈复用 + P 绑定 + 版本日志 2026-06-07 09:49:26 +08:00
xfy911
242a6c7822 chore(coco): 升级 coco 子模块至 v2.2.0 (8b42e98) 2026-06-07 09:41:54 +08:00
xfy911
81be40086f docs(plan): 更新规划文件 — 标记 Doxygen 注释完成并更新待办池 2026-06-07 09:06:12 +08:00
xfy911
9da9bd9449 docs: 为 config.c、log.c、tls.c 添加函数级 Doxygen 注释
- config.c: 为 JSON 解析器内部函数和公共 API 添加完整注释
- log.c: 为日志级别转换和输出函数添加注释
- tls.c: 为 TLS 连接管理、Memory BIO 操作和 ALPN 回调添加注释
- http2.c: 移除过时的 TODO 占位注释(请求体收集已实现)
2026-06-07 09:05:45 +08:00
xfy911
3762343889 docs(plan): 更新规划文件 — 标记编译警告修复完成 2026-06-07 06:07:22 +08:00
xfy911
1b930aa5e1 fix: 消除编译警告并修复测试清理逻辑
- 将 config.c 和 proxy.c 中的 strncpy 替换为 memcpy + 显式 null 结尾,
  消除 GCC -Wstringop-truncation 警告
- 修复 integration_test.sh 的 kill_server 函数,补充对 -c 配置方式启动的
  服务器进程的清理,避免端口占用导致后续测试失败

编译零警告,142 个单元测试 + 80 项集成测试全部通过
2026-06-07 06:06:59 +08:00
xfy911
cc06fc073f feat(proxy): 实现反向代理支持
- 新增 proxy.h / proxy.c:路径前缀匹配 → HTTP/1.1 后端转发
  - proxy_init/add_rule/match/forward API
  - X-Forwarded-For / X-Forwarded-Proto 透传
  - 目前仅支持 HTTP 后端,HTTPS 后端拒绝并警告
- cocoon.h:新增 COCOON_MAX_PROXY_RULES=8,cocoon_config_t 添加 proxies 数组
- config.c:JSON 解析器新增 proxies 数组解析(prefix + target)
- server.c:
  - connection_t 新增 ctx 指针,用于 handle_request 访问代理配置
  - handle_request 中在静态文件服务前检查代理规则
- Makefile:proxy.c 加入 SRCS 和 test_server 编译规则
- cocoon.json:示例配置添加 proxies 数组
- tests/integration_test.sh:新增 3 项反向代理集成测试
- .cocoon-plan.md:标记反向代理为已完成

编译零警告,142 个单元测试 + 80 项集成测试全部通过。
2026-06-07 03:09:10 +08:00
xfy911
b04904cc78 docs(plan): 更新规划文件 — 标记 HTTP/2 POST 支持完成 2026-06-07 00:06:04 +08:00
xfy911
0bf37ba3f0 feat(http2): 实现 HTTP/2 POST 请求体支持
- on_data_chunk_recv_callback: 将 DATA 帧数据追加到 stream->request.body
- on_frame_recv_callback: 根据请求方法选择处理方式(POST → http2_serve_post)
- http2_serve_post: 处理 HTTP/2 POST 请求
  - 支持 multipart/form-data 文件上传
  - 支持 JSON 和 form-urlencoded 回显
  - 构建 JSON 响应并通过 nghttp2 发送
- 包含 multipart.h 和 platform.h 到 http2.c
- 142 个单元测试 + 77 项集成测试全部通过,编译零警告
2026-06-07 00:06:00 +08:00
xfy911
4105aec916 feat(websocket): 实现 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 空闲超时处理
  - 每次循环前调用 poll_readable() 等待数据或超时
  - 超时时发送 1001 Idle timeout 关闭帧,清理连接资源
  - 解决遗留 TODO: /* TODO: 超时处理 */
- tests/websocket_test.py: 新增 test_timeout() 测试
  - 连接后不发帧,验证服务端 2 秒后发送 1001 关闭帧
- tests/integration_test.sh: 新增 WebSocket 空闲超时集成测试
  - 启动 -o 2000 短超时服务器验证超时行为
- Makefile: 补全 test_websocket 编译规则,加入 platform.c
  - 修复 undefined reference 错误
- 全部 142 单元测试 + 77 集成测试通过,编译零警告
2026-06-06 21:16:54 +08:00
xfy911
f868128b75 docs(plan): 更新规划文件 — 标记 CI、Makefile、README 更新完成
- 添加 CI 自动化、Makefile 测试目标完善、README 同步更新到已完成列表
- 记录本轮行动记录
2026-06-06 18:09:57 +08:00
xfy911
068ab7d87e docs(readme): 同步项目现状,补充新功能与 CI badge
- 添加 CI badge(GitHub Actions)
- 特性表格:补充访问日志、HTTPS、HTTP/2、WebSocket、中间件、插件、
  健康检查、跨平台等已完成特性
- 命令行参数:补充 --cors、--auth-user、--auth-pass、--rate-limit、
  --access-log、--plugin 等新选项
- 模块职责:补充 access_log.c、config.c、multipart.c、tls.c、http2.c、
  websocket.c、middleware.c、plugin.c、platform.c
- 路线图:标记 HTTPS/HTTP/2/WebSocket/中间件/插件/健康检查/跨平台为已完成
- 构建说明:补充 unit-test 和 test-all
2026-06-06 18:09:33 +08:00
xfy911
b0ae0f71c8 ci(github): 添加 GitHub Actions 工作流
- 在 push/PR 时自动编译和运行测试
- 安装 Ubuntu 依赖:liburing-dev libz-dev libbrotli-dev libssl-dev libnghttp2-dev
- 构建 coco submodule、编译 cocoon、运行单元测试和集成测试
- 可选运行性能基准(wrk)
2026-06-06 18:08:17 +08:00
xfy911
87f89f5722 build(makefile): 添加 integration-test 别名和 test-all 目标
- integration-test: 作为 test 的别名,更直观
- test-all: 一键运行单元测试 + 集成测试
- 更新 .PHONY 声明
2026-06-06 18:08:11 +08:00
xfy911
e77e83e0c8 docs(plan): 更新规划文件 — 标记插件热重载完成 2026-06-06 15:11:52 +08:00
xfy911
80385d9657 feat(plugin): 插件热重载支持(SIGUSR1)
- plugin.c/plugin.h: 新增 cocoon_plugin_reload() 热重载 API
- 自动存储已加载插件路径,卸载后按原路径重新加载
- main.c: 注册 SIGUSR1 信号处理器,触发插件热重载
- 添加 --help 中 Signals 说明文档
- 集成测试:新增 2 项热重载测试(功能验证 + 日志验证)
- 全部 142 个单元测试 + 77 项集成测试通过
2026-06-06 15:11:17 +08:00
xfy911
4b647cd540 docs(plan): 更新规划文件 — 标记健康检查端点完成
- 集成测试数量更新为 75 项
- 单元测试数量更新为 142 个
- 添加最近行动记录
2026-06-06 12:09:50 +08:00
xfy911
09e592d631 feat(health): 添加服务器健康检查端点 /_health
- 新增 /_health 路由,返回 JSON 格式的服务器状态
- 包含:uptime、活跃连接数、最大连接数、插件列表、中间件列表
- 中间件注册表新增 cocoon_middleware_list() 查询 API
- 集成测试新增 7 项健康检查验证(状态码、JSON 字段、HEAD 支持)
- 编译零警告,142 个单元测试 + 75 项集成测试全部通过
2026-06-06 12:08:39 +08:00
xfy911
b5acd7f5d1 docs(plan): 更新规划文件 — 标记插件数组支持完成 2026-06-06 09:08:05 +08:00
xfy911
2dc29d0687 feat(config): 插件配置支持 JSON 数组格式
- 极简 JSON 解析器新增 '[' / ']' token 支持
- plugins 字段可同时兼容字符串和字符串数组
- 向后兼容:单字符串 "plugins.so" 仍有效
- 向前扩展:数组 ["a.so", "b.so"] 支持多插件

修复:
- .gitignore 添加遗漏的 test_websocket 二进制
- Makefile 补全 test_log 单元测试编译规则
- cocoon.json 示例改为数组格式
- test_config.c 新增 3 项 plugins 解析测试(字符串/单数组/多数组)

全部 142 个单元测试 + 68 项集成测试通过 ✓
2026-06-06 09:07:28 +08:00
xfy911
f2231756a3 docs(plan): 更新规划文件 — 标记 WebSocket 单元测试完成
- 标记 Phase 2 WebSocket 单元测试完成(12 项测试)
- 更新单元测试总数:127 → 139
- 更新集成测试总数:66 → 68
- 标记 Phase 4 插件系统完成(MVP)
- 调整待办池优先级
2026-06-06 06:07:06 +08:00
xfy911
faedbd55a8 test(websocket): 添加 WebSocket 协议单元测试(12 项)
覆盖内容:
- 帧解析:文本/二进制/关闭/空负载、掩码解掩码、16位/64位长度编码
- 帧编码:文本帧、关闭帧(含 code+reason)、ping/pong 往返
- 握手验证:Sec-WebSocket-Accept 计算正确性
- 粘包场景:多帧连续解析
- 边界条件:不完整数据、空负载、64KB 大负载
- 注册表:初始连接数为 0

使用 socketpair 创建内部通信管道,无需真实网络。
2026-06-06 06:04:49 +08:00
xfy911
05cc458440 docs(plan): 更新路线图,标记插件系统完成 2026-06-06 03:14:31 +08:00
xfy911
952cc663fe feat(plugin): 实现动态插件系统(.so 加载 + 中间件注册)
新增插件系统:
- 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:示例插件,演示中间件注册
- 集成测试:新增插件加载 + 日志验证测试(68项全部通过)
- 单元测试:127个全部通过
- 编译:Makefile 添加 plugin.c 和 -ldl
- .gitignore 排除编译产物和上传目录
2026-06-06 03:13:59 +08:00
xfy911
dd41464b9c feat(middleware): 实现中间件框架(CORS / Basic Auth / Rate Limit)
- 新增 middleware.c/middleware.h:注册表 + 链式执行机制
  - 内置 CORS 中间件:支持预检请求、跨域头
  - 内置 Basic Auth 中间件:HTTP 基础认证
  - 内置 Rate Limit 中间件:基于 IP 的秒级限流
- 修复 config_merge 参数不匹配(新增 has_cors_enabled/has_auth_user/has_auth_pass/has_rate_limit)
- 修复 server_destroy 与 main() 双重释放字符串指针
- 修复 main.c 启动段错误(access_log_path 未初始化)
- 修复 rate_limit 哈希函数包含端口导致同一 IP 不同 bucket 的问题
- 修复 rate_limit 中间件 user_data 悬空指针(改为 ctx->mw_config)
- 修复 401/429 响应 Content-Length 与 body 长度不匹配导致 curl 挂起
- 修复集成测试服务器启动循环:使用 nc 代替 curl,避免触发限流计数
- 修复集成测试 kill_server:使用 kill -9 确保进程退出,并检查端口释放
- 单元测试 18/18 通过,集成测试 66/66 通过
2026-06-06 00:32:22 +08:00
xfy911
e542890e26 docs(plan): 更新路线图,标记 WebSocket 广播完成,新增中间件/插件待办 2026-06-05 18:13:50 +08:00
xfy911
035e4bebb4 feat(websocket): 实现 WebSocket 广播与频道路由系统
新增功能:
- ws_registry_add/remove: 连接注册/注销,自动管理活跃连接链表
- ws_broadcast(): 向所有活跃连接广播文本消息
- ws_broadcast_to_path(): 按握手路径(频道)定向广播
- ws_connection_count(): 获取当前 WebSocket 连接数
- ws_handle_connection() 新增 path 参数,用于频道标识

实现细节:
- 全局链表 + pthread_mutex 保证多线程安全
- 原子计数器统计连接数
- 连接建立时自动注册,关闭/异常时自动注销
- 默认行为保持 echo 不变

编译零警告,61 项集成测试 + 127 个单元测试全部通过。
2026-06-05 18:12:46 +08:00
xfy911
2f6d86c5cd fix(coco): 修正子模块指向 v2.2.0 最新提交 62dbb13
之前 merge commit 中子模块树对象误指向旧版本 b45045e,
实际工作区已使用 62dbb13(v2.2.0 后代)编译并全部测试通过。
2026-06-05 18:12:38 +08:00
xfy911
22c933a99d merge main into feature/windows-compat-impl: resolve conflicts for TLS, HTTP/2, WebSocket, access log 2026-06-05 16:17:55 +08:00
xfy911
3ded38f331 docs(plan): 更新路线图,标记 WebSocket 完成,调整待办优先级 2026-06-05 15:19:07 +08:00
xfy911
2775033198 feat(websocket): 实现 RFC 6455 WebSocket 支持
- 新增 websocket.h / websocket.c:帧解析、编码、握手、连接管理
- server.c: 检测 Upgrade: websocket 请求,执行握手后进入 ws_handle_connection
- 支持文本/二进制帧 echo、ping/pong、close 帧
- 使用 OpenSSL SHA1 计算 Sec-WebSocket-Accept
- 集成测试:新增 2 项 WebSocket 测试(Python 标准库实现)
- 61 项集成测试全部通过,127 项单元测试全部通过
2026-06-05 15:18:01 +08:00
xfy911
0ebf8b997d fix(server): 修复多线程模式下服务器无法处理请求的问题
问题根因:
1. coco_accept/coco_sleep/coco_timer 在多线程全局调度器下不工作,
   因为 main_sched 的 poll_fd 和 timer_wheel 无人轮询
2. client_handler 协程栈上分配了约 40KB+ 的 http_request_t,
   超出默认 2KB 协程栈,导致栈溢出 SIGSEGV

修复方案:
- 主线程直接 accept_loop(poll 阻塞),不使用协程
- accept 成功后通过 coco_go_with_opts 创建 client_handler 协程,
  显式指定 1MB 栈大小
- 单线程模式保持原有行为不变

测试:
- 59/59 集成测试通过
- 127/127 单元测试通过
- curl 多线程模式 HTTP 请求正常返回
2026-06-05 12:37:40 +08:00
xfy911
c5162db508 docs(plan): 更新 coco 子模块升级记录,标记多线程模式问题 2026-06-05 03:14:22 +08:00
xfy911
d2c6dc3617 chore(coco): 升级子模块到 v2.2.0,包含调度器负载重分配与修复 2026-06-05 03:03:42 +08:00
xfy
782bce9122 docs(plan): 更新 Windows 兼容性状态
- 将 Windows 兼容性标记为已完成
- 更新当前状态:跨平台抽象层 platform.h + platform.c
- 更新待办池:移除 Windows 任务,聚焦 HTTPS/TLS 和 HTTP/2
- 添加 Windows 兼容性实现详情章节
2026-06-05 00:51:09 +08:00
xfy
556caf4412 build(makefile): 添加 platform.c 和 Windows 链接选项
- 源文件列表添加 platform.c
- LDFLAGS 添加 -lbrotlienc
- Windows (MinGW) 下自动链接 ws2_32
- 单元测试编译规则添加 platform.c
2026-06-05 00:51:02 +08:00
xfy
e92354d292 refactor(static): 使用跨平台 API 替代 POSIX 依赖
- 文件操作: open/read/close/seek → cocoon_file_open/read/close/seek
- 目录遍历: opendir/readdir/closedir → cocoon_dir_open/next/close
- socket 发送: sendfile → cocoon_sendfile (POSIX) / read+send 64KB (Windows)
- 路径处理: realpath → cocoon_path_resolve
- 文件元数据: stat → cocoon_file_stat
- mkdir 跨平台处理
2026-06-05 00:50:56 +08:00
xfy
7df6ada99e refactor(server): 使用跨平台 API 替代 POSIX 依赖
- int fd → cocoon_socket_t 类型统一
- fcntl O_NONBLOCK → cocoon_socket_nonblock()
- close(fd) → cocoon_socket_close()
- 信号处理 → cocoon_signal_setup()
- 文件元数据 → cocoon_file_stat()
- 路径处理 → cocoon_path_join()
- CPU 核心数 → cocoon_cpu_count()
2026-06-05 00:50:34 +08:00
xfy
78507084c4 refactor(main): 使用跨平台 API 替代 POSIX 依赖
- 移除 <signal.h> 头文件
- 新增 cocoon_socket_init() / cocoon_socket_cleanup() 调用
- 信号处理改用 cocoon_signal_setup() 统一封装
- Windows 下自动 WSAStartup/WSACleanup
2026-06-05 00:50:28 +08:00
xfy
adeeda1fc1 feat(build): 添加 CMakeLists.txt 跨平台构建配置
- 自动检测 Windows/POSIX 平台
- Windows 下链接 ws2_32、查找 brotlienc
- POSIX 下使用 pkgconfig 查找 zlib、libbrotlienc
- 支持 MinGW 和 MSVC 编译器
- 包含安装规则
2026-06-05 00:50:23 +08:00
xfy
c9693612bd feat(platform): 新增跨平台抽象层 platform.h + platform.c
- platform.h: 定义跨平台类型 cocoon_socket_t / cocoon_file_t / cocoon_dir_iter_t
- POSIX 路径: fcntl O_NONBLOCK, sendfile 零拷贝, opendir/readdir, sysconf
- Windows 路径: ioctlsocket(FIONBIO), WSAStartup/WSACleanup, FindFirstFile
- 错误码统一: WSAEWOULDBLOCK→EAGAIN, WSAEINTR→EINTR, WSAECONNRESET→ECONNRESET
- 全部中文注释,Doxygen 风格
2026-06-05 00:50:18 +08:00
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
xfy911
3374130c8c docs(plan): 更新行动记录,http2.c 注释完成
标记 Doxygen 中文注释任务进度(http2.c 已完成)。
更新最近行动记录:添加本轮 http2.c 注释详情。
2026-06-04 21:08:03 +08:00
xfy911
d0f3bb860f docs(http2): 添加完整的中文 Doxygen 注释
为 http2.c 所有 29 个函数添加中文文档注释:
- 压缩辅助函数(is_compressible_mime, gzip_compress, brotli_compress)
- 会话管理(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)

所有注释包含功能说明、参数说明和返回值说明。
2026-06-04 21:07:05 +08:00
xfy911
606c7b6b4e feat(http2): 添加 HTTP/2 目录浏览支持
- 新增 http2_serve_directory() 函数,生成 HTML 目录列表页面
- 目录无 index.html 时自动返回目录浏览(与 HTTP/1.1 行为一致)
- 支持 HTML 转义、文件大小格式化、修改时间显示、上级目录链接
- 支持 HEAD 请求(不发送 body)
- 新增 2 项集成测试:HTTPS h2 目录浏览 + h2c 目录浏览
- 54 项集成测试全部通过,35 个单元测试全部通过
2026-06-04 18:13:48 +08:00
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
xfy911
8a80ec9d96 docs(plan): 修正测试计数,单元测试 35 个 2026-06-04 16:21:48 +08:00
xfy911
158c2a894e docs(plan): HTTP/2 压缩已完成,更新待办池 2026-06-04 16:17:53 +08:00