170 Commits

Author SHA1 Message Date
xfy911
ff1b56fc9e docs(plan): 更新计划,标记连接池完成
- 待办池:连接池完成,新增 HTTP/2 代理支持待办
- 最近行动记录:新增 2026-06-09 连接池/keep-alive 条目
2026-06-09 00:21:59 +08:00
xfy911
e13ff5402a feat(proxy): 后端连接池/keep-alive,避免每次请求新建 TCP
- proxy.h: 新增 cocoon_pooled_conn_t / cocoon_conn_pool_t (pthread_mutex 保护)
  - 每个后端最多4个空闲连接,30秒空闲超时
  - 支持 HTTP 和 HTTPS 后端,复用 tls_conn / fd
- proxy.c: 实现 proxy_pool_init/destroy/acquire/release + proxy_config_destroy
- proxy.c: proxy_relay_backend 使用连接池获取/归还,向后端发送 Connection: keep-alive
- proxy.c: 修复后端关闭连接后复用导致客户端超时的问题
  - recv 返回 0 时不再归还到池中,直接关闭并重建
- server.c: server_destroy 调用 proxy_config_destroy 清理所有连接池
- 编译零警告,142 单元测试 + 90 集成测试全部通过
2026-06-09 00:21:22 +08:00
xfy911
c3716cd704 docs(plan): 更新计划文件,标记健康检查与 SIGPIPE 修复完成 2026-06-08 21:27:48 +08:00
xfy911
77979b44d8 feat(proxy): 后端被动健康检查 + 修复 SIGPIPE 崩溃
- 在 cocoon_proxy_backend_t 中增加健康状态字段(healthy/fail_count/success_count/last_check)
- 实现 proxy_relay_backend() 辅助函数,支持流式转发响应
- 代理请求时优先尝试 healthy 后端,全部失败后再 fallback 到所有后端
- 健康阈值:连续 2 次成功恢复,连续 3 次失败标记不健康
- 修复 SIGPIPE 信号导致进程在客户端提前关闭连接时崩溃的问题
- 全部 142 单元测试 + 90 集成测试通过
2026-06-08 21:26:33 +08:00
xfy911
61d9b01ed6 docs(plan): 更新 Prometheus 指标端点开发记录
- 标记反向代理负载均衡和 Prometheus 指标为完成
- 更新项目状态:142 单元测试 + 90 集成测试全部通过
- 记录 /_metrics 端点实现详情
2026-06-08 18:11:10 +08:00
xfy911
8ad8ecaaef feat(metrics): Prometheus /_metrics 端点 + 响应码分类计数器
- 新增 7 个原子计数器:total_requests, response_2xx/3xx/4xx/5xx/200/404
- 在 handle_request 所有响应路径统一调用 update_metrics() 更新计数器
- 新增 /_metrics 端点,返回 Prometheus 文本格式(10 项指标)
  - 计数器:requests_total, response_2xx_total, response_3xx_total,
            response_4xx_total, response_5xx_total, response_200_total,
            response_404_total
  - 仪表盘:uptime_seconds, connections_active, connections_max
- 集成测试:新增 8 项 Prometheus 指标测试(状态码、字段检查、
  HEAD 支持、计数器递增验证)
- 编译零警告,142 单元测试 + 90 集成测试全部通过
2026-06-08 18:09:08 +08:00
xfy911
c3d4b112d7 docs(config+plan): 负载均衡示例 + 开发记录更新
- cocoon.json: 展示多后端负载均衡配置(/api -> 3000/3001)
- .cocoon-plan.md: 标记负载均衡完成,更新待办池和最近行动记录
2026-06-08 16:17:14 +08:00
xfy911
acda3b9c3e feat(proxy): 反向代理负载均衡(轮询 + 故障转移)
- proxy.h: 重构数据结构,支持多后端(cocoon_proxy_backend_t)
- proxy.c: 实现轮询调度 + 自动故障转移(后端失败时尝试下一个)
- proxy.c: proxy_add_rule 支持同 prefix 追加后端,自动合并为多后端规则
- server.c: 匹配 proxy.h 新签名
- 编译零警告,142 单元测试 + 82 集成测试全部通过
2026-06-08 16:15:51 +08:00
xfy911
a2444e18de docs(plan): 再次恢复开发 — 用户指示继续 cocoon,不暂停 2026-06-08 15:58:56 +08:00
xfy911
06e34e5a39 docs(readme): 更新反向代理文档与配置示例
- 特性列表新增反向代理条目
- 路线图标记反向代理为完成
- 模块职责表新增 proxy.c / proxy_tls.c
- 新增配置文件示例(含反向代理配置)
2026-06-08 12:04:29 +08:00
xfy911
4cb840c464 docs(plan): 更新开发记录 — 恢复开发 + HTTPS 反向代理完成 2026-06-08 11:38:11 +08:00
xfy911
a86b8a4856 feat(proxy): HTTPS 反向代理后端支持
- 新增 proxy_tls.c/h:轻量级 OpenSSL 客户端封装
- proxy.c:支持 HTTPS 后端连接(TLS 握手 + SNI + 透传 X-Forwarded-Proto: https)
- 集成测试:新增 HTTPS 后端 Python 脚本 + 2 项代理测试
- 编译零警告,142 单元测试 + 82 集成测试全部通过
2026-06-08 11:37:30 +08:00
xfy911
de88bbc692 docs(plan): 恢复项目开发 — 用户指示继续 cocoon,暂停 ephemeral 方向 2026-06-08 11:25:08 +08:00
xfy911
b6edd5ef67 docs(plan): 更新维护检查记录 — 2026-06-08 09:00 2026-06-08 09:01:50 +08:00
xfy911
b289a09898 docs(plan): 更新维护检查记录 — 2026-06-08 06:00 2026-06-08 06:02:03 +08:00
xfy911
f3d53af5de docs(plan): 更新维护检查记录 — 2026-06-08 03:00 2026-06-08 03:01:23 +08:00
xfy911
61d8af0a8a docs(plan): 更新维护检查记录 — 2026-06-08 00:00 2026-06-08 00:05:59 +08:00
xfy911
90b0388892 fix(server): 移除 coco_version() 调用,修复链接错误
coco v2.2.0 子模块中 version.c 未编译进 libcoco.a,
导致 coco_version() 符号未定义。移除 3 行重复的信息日志
(似乎是历史合并遗留),编译恢复通过。

- 编译: 零警告(仅 coco 子模块 .S 文件 linker 提示)
- 单元测试: 142 个全部通过 ✓
- 集成测试: 80 项全部通过 ✓
2026-06-08 00:05:31 +08:00
xfy911
e2bceeaa44 docs(plan): 更新维护检查记录 — 2026-06-07 21:00 2026-06-07 21:02:21 +08:00
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