Skip to content

Releases: Hical61/Hical

v2.5.1

08 May 10:19

Choose a tag to compare

Added

  • SyncMiddleware 快速路径(零协程帧中间件):
    • 新增 SyncBeforeHandler / SyncAfterHandler / SyncMiddlewareResult 类型(Middleware.h
    • 新增 MiddlewareEntry 统一存储结构(Async/Sync 标签联合)
    • MiddlewarePipeline 新增 3 个同步 use() 重载,RouteGroup 新增 2 个
    • buildOptimizedChain() 算法:连续 Sync 条目合并为单个协程帧,N 层同步中间件仅 1 次协程帧堆分配
  • MemoryPool::threadLocalPool() 公共方法,暴露 thread-local 无锁池资源指针

Changed

  • HttpServer 多 io_context 架构
    • ioContext_ 替换为 AsioEventLoop baseLoop_ + EventLoopPool ioPool_(1 Thread : 1 io_context)
    • acceptLoop() 去除 make_strand,round-robin 分发到 worker loop(单线程天然串行)
    • accept 后立即设置 TCP_NODELAY 减少 Nagle 延迟
    • stop() / gracefulStop() 改为停止所有 loop(baseLoop + ioPool)
  • handleSession() 请求级 PMR 池改为栈上 monotonic_buffer_resource + thread-local 无锁池作 upstream,消除 make_unique 堆分配和同步锁竞争
  • MiddlewarePipeline::build() / buildFor() 非 profiling 路径改用 buildOptimizedChain(entries_)
  • MiddlewarePipeline::size() 改为返回 entries_.size()(支持纯 Sync 中间件计数)
  • 新增 HttpServer::recommendedMaxConnections(availableMemoryMB) 静态方法:按 25KB/连接 估算并预留 30% 内存,上限 65535,供使用者根据机器内存自行设置 maxConnections(默认值仍为 10000)
  • PoolConfig::requestPoolInitialSize 默认值从 8192 降至 4096
  • handleSession() 主路径去除冗余 prepare_payload() 调用(已由 setBody() / setJsonBody() 内部完成)
  • RouteGroup 中间件预构建优化RouteGroup 同步分支接入 buildOptimizedChain(),组级 Sync 中间件同样享受零协程帧合并

Full Changelog: v2.5.0...v2.5.1

v2.5.0

04 May 17:00

Choose a tag to compare

Added

  • 日志系统(6 级日志,零开销设计):
    • Log.h/cppLogger 单例 + 6 级 LogLevel(Trace/Debug/Info/Warn/Error/Fatal),std::format 风格 API(HICAL_LOG_INFO("port={}", 8080))、流式 API(HICAL_LOG_INFO_STREAM << val)、条件宏(HICAL_LOG_INFO_IF)、结构化字段 API(HICAL_LOG_INFO_F),NDEBUG 下 TRACE 编译期消除,thread_local 时间戳/线程 ID 缓存,可配置 flush 级别,Fatal 自动 abort
    • LogRecord.h — 结构化日志条目(level/timestamp/threadId/file/line/message + boost::json::object fields + traceId)
    • LogFormatter.h/cpp — 格式化器接口 + TextFormatterthread_local 时间戳缓存)+ JsonFormatter(JSON Lines,UTC 时间戳)
    • LogSink.h/cpp — 可插拔输出后端接口 + StderrSink(fprintf)+ FileSink(同步 fwrite + LogFile 轮转)+ OStreamSink(线程安全 ostream 包装)
    • LogFile.h/cpp — 日志文件轮转引擎(按大小轮转默认 100MB、最大文件数限制、时间戳序列命名、严格文件名匹配清理)
    • AsyncFileSink.h/cpp — 异步双缓冲文件 Sink(std::jthread + stop_token 后台线程、4MB 前后缓冲交换、背压保护丢弃 + 计数、1 秒超时刷盘、优雅关闭含最终缓冲排空)
    • FixedBuffer.h — 栈上固定缓冲区模板(默认 4KB),std::to_chars 整数/浮点格式化,溢出自动 fallback 到堆
    • LogChannel.h/cpp — 命名日志通道(独立 level/formatter/sinks),LogChannelRegistryshared_mutex 读多写少),HICAL_LOG_TO 通道路由宏
    • LogMiddleware.h/cpp — 洋葱模型日志中间件(OpenSSL RAND_bytes 128 位 trace-id 自动生成,结构化访问日志到命名通道)
    • LogAdmin.h/cpp — 动态日志级别管理端点(GET /admin/log-level 查询 + PUT /admin/log-level 运行时调整)
    • 9 个测试文件(97 个用例):test_log / test_log_ndebug / test_fixed_buffer / test_log_file / test_async_file_sink / test_log_formatter / test_log_channel / test_log_middleware / test_log_admin
  • OpenAPI 3.0 自动生成模块HICAL_WITH_OPENAPI=ON,默认开启,零新依赖):
    • OpenApiSchema.h — 从 HICAL_JSON 宏自动生成 JSON Schema(基本类型/vector/嵌套结构体/$ref),HICAL_SCHEMA_NAME 注册类型名,collectSchemas<T>() 递归收集
    • OpenApiRegistry.h/cpp — 路由元数据注册表(HICAL_API() 综合标注宏 + builder::* 辅助函数、HICAL_ROUTES_WITH_API() 增强版路由收集、registerRoutesWithOpenApi() 同时注册路由和元数据)
    • OpenApiDocument.h/cpp — 文档组装(惰性生成 + 缓存、自动路径参数提取、同路径不同 method 合并为同一 Path Item)
    • OpenApiEndpoint.hserveOpenApi() 一键注册 /openapi.json + /docs(Swagger UI CDN),boost::json::serialize() 安全转义防 JS 注入
    • 1 个测试文件(35 个用例):test_openapi
    • 1 个示例:examples/openapi_server.cpp

Full Changelog: v2.4.0...v2.5.0

v2.4.0

01 May 14:39

Choose a tag to compare

Added

  • CORS 中间件
    • Cors.hmakeCorsMiddleware(CorsOptions{...}),支持 Origin 通配符/精确匹配、Preflight OPTIONS 自动响应、Vary: Origin 缓存提示、凭证模式下禁止通配符安全校验、可配置 maxAge
  • 路由组(Route Group)
    • RouteGroup.h/cpprouter.group("/api/v1") 前缀分组,支持组级中间件继承、多层嵌套、镜像 Router API(get/post/put/del/route)
  • HTTP 核心增强
    • HttpRequest 新增查询参数解析 API(queryParam()/queryParams())和表单参数解析 API(formParam()/formParams()
    • HttpResponse 新增 redirect() 便捷方法
    • HttpServer 新增全局错误处理器 setErrorHandler(),优雅关闭 shutdown() 支持
    • 7 个测试文件:test_query_params / test_form_params / test_redirect / test_cors / test_route_group / test_error_handler / test_graceful_shutdown

Full Changelog: v2.3.0...v2.4.0

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