cocoon/CMakeLists.txt
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

156 lines
3.8 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Cocoon - 跨平台构建配置
#
# 支持 Linux 和 Windows 构建。
# 自动检测平台并选择正确的编译选项和链接库。
#
# 使用方式:
# mkdir build && cd build
# cmake ..
# make # Linux
# cmake --build . # Windows (MSBuild / Ninja)
#
# @author xfy
cmake_minimum_required(VERSION 3.10)
project(cocoon C)
# 设置 C 标准
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
# 源文件列表
set(COCOON_SOURCES
main.c
server.c
http.c
static.c
log.c
config.c
multipart.c
platform.c
tls.c
http2.c
access_log.c
websocket.c
middleware.c
)
# 头文件路径
set(COCOON_INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/coco/include
)
# === 平台检测 ===
if(WIN32)
# Windows 构建
message(STATUS "平台: Windows")
add_definitions(-DWIN32_LEAN_AND_MEAN)
# 编译选项
add_compile_options(
/W4
/O2
$<$<CONFIG:Debug>:/Zi>
)
# 链接库
set(COCOON_LIBS ws2_32)
# 静态运行时(可选,避免 MSVC 运行时依赖)
# set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
else()
# Linux / macOS 构建
message(STATUS "平台: POSIX (Linux/macOS)")
# 编译选项
add_compile_options(
-Wall
-Wextra
-O2
-D_GNU_SOURCE
)
# 调试模式
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_compile_options(-g -O0 -DCOCOON_DEBUG)
endif()
# 链接库
find_package(Threads REQUIRED)
set(COCOON_LIBS
Threads::Threads
m
z
)
# 可选liburingLinux 5.1+
find_library(URING_LIB uring)
if(URING_LIB)
message(STATUS "找到 liburing启用 io_uring 支持")
list(APPEND COCOON_LIBS ${URING_LIB})
else()
message(STATUS "未找到 liburing跳过 io_uring 支持")
endif()
# Brotli 压缩库
find_library(BROTLI_LIB brotlienc)
if(BROTLI_LIB)
list(APPEND COCOON_LIBS ${BROTLI_LIB})
else()
message(WARNING "未找到 brotlienc 库Brotli 压缩将不可用")
endif()
endif()
# === 目标定义 ===
add_executable(cocoon ${COCOON_SOURCES})
target_include_directories(cocoon PRIVATE ${COCOON_INCLUDE_DIRS})
# coco 库依赖(优先使用 submodule
set(COCO_DIR "${CMAKE_CURRENT_SOURCE_DIR}/coco" CACHE PATH "coco 库路径")
if(EXISTS "${COCO_DIR}/CMakeLists.txt")
message(STATUS "使用 coco submodule: ${COCO_DIR}")
add_subdirectory(${COCO_DIR} ${CMAKE_BINARY_DIR}/coco)
target_link_libraries(cocoon PRIVATE coco ${COCOON_LIBS})
else()
message(STATUS "未找到 coco 子模块,假设已预编译")
# 假设 coco 已预编译并可通过 find_library 找到
# target_link_libraries(cocoon PRIVATE ${COCOON_LIBS})
endif()
# === 安装规则 ===
install(TARGETS cocoon DESTINATION bin)
# === 测试支持 ===
enable_testing()
# 集成测试
find_program(BASH_EXECUTABLE bash)
if(BASH_EXECUTABLE)
add_test(
NAME integration_test
COMMAND ${BASH_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/integration_test.sh
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
endif()
# 单元测试Unity 框架)
set(UNIT_TESTS test_server test_http test_static test_log test_config test_multipart)
foreach(test_name ${UNIT_TESTS})
set(test_src "${CMAKE_CURRENT_SOURCE_DIR}/tests/unit/${test_name}.c")
if(EXISTS ${test_src})
add_executable(${test_name} ${test_src} ${COCOON_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/tests/unity/unity.c)
target_include_directories(${test_name} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/tests/unity
)
target_link_libraries(${test_name} PRIVATE ${COCOON_LIBS})
add_test(NAME ${test_name} COMMAND ${test_name})
endif()
endforeach()