Releases: Hical61/Hical
Releases · Hical61/Hical
v2.5.1
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 降至 4096handleSession()主路径去除冗余prepare_payload()调用(已由setBody()/setJsonBody()内部完成)- RouteGroup 中间件预构建优化:
RouteGroup同步分支接入buildOptimizedChain(),组级 Sync 中间件同样享受零协程帧合并
Full Changelog: v2.5.0...v2.5.1
v2.5.0
Added
- 日志系统(6 级日志,零开销设计):
Log.h/cpp—Logger单例 + 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 自动 abortLogRecord.h— 结构化日志条目(level/timestamp/threadId/file/line/message +boost::json::objectfields + traceId)LogFormatter.h/cpp— 格式化器接口 +TextFormatter(thread_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),LogChannelRegistry(shared_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.h—serveOpenApi()一键注册/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
Added
- CORS 中间件:
Cors.h—makeCorsMiddleware(CorsOptions{...}),支持 Origin 通配符/精确匹配、Preflight OPTIONS 自动响应、Vary: Origin缓存提示、凭证模式下禁止通配符安全校验、可配置 maxAge
- 路由组(Route Group):
RouteGroup.h/cpp—router.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
What's New
🗄️ 协程数据库中间件(Boost.MySQL 后端)
- 四层架构:DbConfig / DbResult / DbConnection 接口 / 连接池 / HTTP 中间件 / 查询日志
MysqlConnection:基于 Boost.MySQLany_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
详见 CHANGELOG.md
Full Changelog: v2.1.0...v2.2.0
v2.1.0
Breaking Changes
- HttpRequest 返回类型收紧:
header()返回string_view(原string)、cookie()/param()返回const string&(原string)、contentType()返回string_view、jsonBody()返回const json::value&(原值拷贝)——大多数调用点源码兼容,仅存储到auto的场景可能需确认 - serveStatic 异步化:返回类型从
function<HttpResponse(...)>改为function<Awaitable<HttpResponse>(...)>,调用方需在协程中co_await - Boost 最低版本:1.70 → 1.78(
random_access_file依赖) - Linux 新增依赖:
liburing-dev(Boost.Asiorandom_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/nullfd),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,防止大无符号数据丢失 - 中间件预构建 API:
MiddlewarePipeline::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 测试补充:
RegenerateSession、RegenerateNonExistent、MigrateFromSession、RegenerateConcurrent4 个测试
Changed
- Session 读写锁:
SessionManager::mutex_从std::mutex升级为std::shared_mutex,find()使用shared_lock提升读并发 - Session 懒 GC:
find()不再立即删除过期条目(避免 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
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 — 安全加固与性能优化
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=true、secure=true、sameSite="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
v1.0.1
Added
- vcpkg overlay port(
ports/hical/),支持vcpkg install hical --overlay-ports=./ports HICAL_BUILD_TESTS/HICAL_BUILD_EXAMPLESCMake 选项(默认 ON),作为库分发时可关闭hical::hical_coreALIAS 目标docs/integration_guide.md:vcpkg overlay、FetchContent、cmake install 三种集成方式说明
Fixed
INSTALL_INTERFACEinclude 路径修正,修复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:首次公开发布
Full Changelog: https://github.com/Hical61/Hical/commits/v1.0.0