Skip to content

Releases: Hical61/Hical

v2.3.0

30 Apr 01:27

Choose a tag to compare

What's New

🗄️ 协程数据库中间件(Boost.MySQL 后端)

  • 四层架构:DbConfig / DbResult / DbConnection 接口 / 连接池 / HTTP 中间件 / 查询日志
  • MysqlConnection:基于 Boost.MySQL any_connection,支持 PreparedStatement LRU 缓存
  • DbConnectionPool:协程信号量、LIFO 复用、后台健康检查、空闲淘汰、ping 宽限期优化
  • DbMiddleware:自动事务提交/回滚、连接注入、洋葱模型集成
  • DbQueryLog:装饰器模式查询日志、慢查询检测回调
  • StmtCache:LRU 预编译语句缓存,透明 string_view 零分配查找
  • 通过 cmake -DHICAL_WITH_DATABASE=ON 启用,编译期 HICAL_HAS_DATABASE 宏隔离

📝 文档更新

  • API 参考、架构文档、构建指南、示例文档全面补充数据库中间件内容
  • 新增 scripts/bump_version.py 版本号管理脚本

依赖

  • Boost >= 1.85(数据库中间件需要 Boost.MySQL + charconv)
  • 核心框架仍仅需 Boost >= 1.82

Full Changelog: v2.2.0...v2.3.0

v2.2.0

28 Apr 06:35

Choose a tag to compare

详见 CHANGELOG.md

Full Changelog: v2.1.0...v2.2.0

v2.1.0

24 Apr 02:51

Choose a tag to compare

Breaking Changes

  • HttpRequest 返回类型收紧header() 返回 string_view(原 string)、cookie() / param() 返回 const string&(原 string)、contentType() 返回 string_viewjsonBody() 返回 const json::value&(原值拷贝)——大多数调用点源码兼容,仅存储到 auto 的场景可能需确认
  • serveStatic 异步化:返回类型从 function<HttpResponse(...)> 改为 function<Awaitable<HttpResponse>(...)>,调用方需在协程中 co_await
  • Boost 最低版本:1.70 → 1.78(random_access_file 依赖)
  • Linux 新增依赖liburing-dev(Boost.Asio random_access_file 在 Linux 上依赖 io_uring)

Added

  • 文件异步发送TcpConnection::sendFile(path, offset, length) + WriteNode 多态写队列(MemoryWriteNode / FileWriteNode),支持 random_access_file 异步读取 + 64KB 分块发送
  • macOS 平台回退GenericConnection::sendFileNode()serveStatic() 在无 BOOST_ASIO_HAS_FILE 平台自动回退到 std::ifstream 同步读取
  • WebSocket Origin 白名单Router::ws() 新增 WsOptions 重载,支持 allowedOrigins 集合,不在白名单内的 Origin 返回 403(CSWSH 防护)
  • WebSocket 中间件链:WS 升级请求经过预构建的中间件链,中间件可返回非 200 阻止升级(认证/限流)
  • WebSocket 空闲超时:复用 idleTimeout_ 设置,超时无消息的 WS 连接自动断开
  • 空闲连接超时清理TcpServer::setIdleTimeout(seconds) + idleCheckLoop() 协程定期扫描,断开超时连接
  • fd 耗尽防护IdleFd 类(POSIX 预留 /dev/null fd),EMFILE 时临时释放→accept→close→重新预留,避免 accept 循环忙转
  • Session 重建SessionManager::regenerate(oldId) 生成新 ID 并迁移数据,旧 ID 失效(Session 固定攻击防护)
  • Session 数据迁移Session::migrateFrom(other) 原子迁移数据,地址序双锁防死锁
  • MetaJson 装饰器:C++20 宏路径新增 ALIAS(field, "key")REQUIRED(field)REQUIRED_ALIAS(field, "key")HICAL_IGNORE(field)__VA_OPT__ 递归展开无字段数上限
  • MetaJson C++26 属性[[hical::json_name("alias")]][[hical::json_required]][[hical::json_ignore]] + jsonSchema<T>() / toJsonSnakeCase<T>()
  • MetaJson unsigned 支持valueToJson() / valueFromJson() 正确处理 uint64_t,防止大无符号数据丢失
  • 中间件预构建 APIMiddlewarePipeline::buildFor(finalHandler) 返回可缓存的 MiddlewareNext
  • Multipart 双 API:新增 getFile(parts, fieldName) / getField(parts, fieldName) 重载,搜索预解析结果避免重复解析
  • HTTP Header 注入防护HttpRequest::setHeader()HttpResponse::setHeader() 拒绝含 CR/LF 的头部名/值
  • SSL 懒包含SslConnection.h 独立类型别名头文件,非 SSL 场景不拉 OpenSSL 头文件
  • Session 测试补充RegenerateSessionRegenerateNonExistentMigrateFromSessionRegenerateConcurrent 4 个测试

Changed

  • Session 读写锁SessionManager::mutex_std::mutex 升级为 std::shared_mutexfind() 使用 shared_lock 提升读并发
  • Session 懒 GCfind() 不再立即删除过期条目(避免 shared→unique 锁升级竞态),过期条目由 gc() 定期清理;create() 达上限时先强制 GC 再拒绝
  • 路由参数分组:参数路由从全局 vector 改为 unordered_map<HttpMethod, vector>,dispatch 仅扫描匹配方法的子集
  • 路径 DoS 防护:单遍扫描同时计算 URL 解码需求和段深度,>256 段早期拒绝(hMaxPathSegments
  • 连接存储优化TcpServer 连接集合从 set 改为 unordered_set(O(1) 插入/删除)
  • 连接活跃时间GenericConnection 新增 lastActiveTimeMs_ 原子字段,读写循环更新
  • HttpRequest path params:存储从 unordered_map 改为 vector<pair>,小参数集更少分配
  • jsonBody() 缓存:多次调用只解析一次,后续返回缓存引用
  • PmrBuffer 自适应retrieveAll() 超过 2× 初始容量时自动缩容;ensureWritableBytes() 改为 2× 指数增长
  • StaticFiles 路径缓存PathCache(4096 条目 / 60s TTL)避免每请求 canonical() 系统调用
  • Multipart toLowerInPlace:头部键原地小写,消除临时 string 拷贝
  • GenericConnection 写队列:从 deque<shared_ptr<string>> 改为 deque<shared_ptr<WriteNode>>,统一内存/文件节点

Security

  • WebSocket Origin 白名单(CSWSH 防护)
  • HTTP Header CR/LF 注入防护(Response Splitting 防护)
  • Session regenerate() 防 Session 固定攻击
  • 路径段深度限制防 DoS

Full Changelog: v2.0.1...v2.1.0

v2.0.1

21 Apr 07:45

Choose a tag to compare

What's Changed

Bug Fixes

  • CMake: 添加 WINDOWS_EXPORT_ALL_SYMBOLS 属性,修复 MSVC 下 shared 库构建时无法生成导入库 (.lib) 的问题

Package Manager Support

  • 新增 Conan Center Index (CCI) 提交支持

Full Changelog: v2.0.0...v2.0.1

v2.0.0 — 安全加固与性能优化

19 Apr 06:16

Choose a tag to compare

Fixed

  • [P0] Middleware 悬空引用build()execute() 中 lambda 按引用捕获 middlewares_[i] 改为按值捕获,防止协程帧中 use-after-free
  • [P0] HttpServer timer 竞态:超时 steady_timer 移到循环外复用,引入 shared_ptr<atomic<bool>> 存活标志 + RAII 守卫,消除 timer 回调访问已销毁 socket 的竞态
  • [P0] GenericConnection 数据竞争reading_bool 改为 std::atomic<bool>,修复 stopRead() 跨线程写入与 readLoop() 读取之间的数据竞争
  • [P0] TcpServer acceptLoop use-after-this:协程 lambda 捕获 alive_ 标志,循环条件和 co_await 恢复后均检查存活性,防止析构后访问 this
  • [P1] Multipart DoS 检查位置:Part 数量上限检查从 push_back 之后移到之前,避免先分配后丢弃

Changed

  • Middleware 重构:提取公共 buildChain() 方法消除 build()/execute() 逻辑重复;新增无参 execute(HttpRequest&) 重载走缓存路径,双参 execute(req, finalHandler) 始终动态构建
  • Session ID 生成:从 std::mt19937_64(伪随机)改为 OpenSSL RAND_bytes(密码学安全),hex 编码改为查表法消除 ostringstream 开销
  • Cookie 安全默认值CookieOptions 默认 httpOnly=truesecure=truesameSite="Lax"SessionOptions::secure 同步改为 true
  • Session 嵌套锁消除Session::lastAccess_chrono::time_point(mutex 保护)改为 atomic<int64_t> 纳秒时间戳,touch() / lastAccess() 无锁操作
  • send(PmrBuffer&&) 语义修复:改为调用 buffer.readAll()send(std::string&&) 的 move 通道,不再退化为拷贝
  • Router urlDecode 快速路径:先扫描路径是否含 %/+,无编码字符时跳过 urlDecode 分配;RouteKey 引入透明哈希(RouteKeyView + is_transparent),staticRoutes_.find() 直接用 string_view 查找,消除每请求的 std::string 堆分配
  • HttpServer 中间件调用:已 build() 场景改用无参 execute(req),每请求省去一次 std::function 堆分配

Added

  • SessionOptions::maxSessions(默认 100000):Session 存储上限,create() 达到上限时返回 nullptr,中间件返回 503

Full Changelog: v1.0.1...v2.0.0

Full Changelog: v1.0.1...v2.0.0

v1.0.1

12 Apr 10:09

Choose a tag to compare

v1.0.1

Added

  • vcpkg overlay port(ports/hical/),支持 vcpkg install hical --overlay-ports=./ports
  • HICAL_BUILD_TESTS / HICAL_BUILD_EXAMPLES CMake 选项(默认 ON),作为库分发时可关闭
  • hical::hical_core ALIAS 目标
  • docs/integration_guide.md:vcpkg overlay、FetchContent、cmake install 三种集成方式说明

Fixed

  • INSTALL_INTERFACE include 路径修正,修复 find_package 后头文件找不到的问题
  • Windows ws2_32/mswsock 统一移至 hical_core 目标,消费者无需手动添加

Changed

  • 移除全局 include_directories,改为完全依赖 target_include_directories 传递
  • GTest 改为按需查找,仅 HICAL_BUILD_TESTS=ON 时才 find_package

Full Changelog: v1.0.0...v1.0.1

v1.0.0:首次公开发布

11 Apr 17:13

Choose a tag to compare