- Makefile: 4 个单元测试规则缺失 throttle.c(test_websocket/test_grpc/test_http3/test_acme) - test_acme_config.c: config_merge 调用缺少 has_throttle_conn_rate / has_throttle_global_rate - test_config.c: 5 处 config_merge 调用同步补齐 throttle 参数 - 新增 Dockerfile: debian bookworm-slim 多阶段构建,最终镜像约 50MB - 新增 .dockerignore: 排除构建产物和开发文件 - 编译验证:零警告(仅外部 coco 库 GNU-stack linker 提示) - 单元测试:480 个全部通过 ✓(1 个 Ignored 为预期行为)
This commit is contained in:
parent
2e13ee2913
commit
2c5538bea1
35
.dockerignore
Normal file
35
.dockerignore
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Git
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.gitmodules
|
||||||
|
|
||||||
|
# 构建产物
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
cocoon
|
||||||
|
tests/unit/test_*
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
|
||||||
|
# 日志
|
||||||
|
*.log
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# 临时文件
|
||||||
|
*.tmp
|
||||||
|
*.bak
|
||||||
|
|
||||||
|
# Docker 自身
|
||||||
|
Dockerfile
|
||||||
|
.dockerignore
|
||||||
|
|
||||||
|
# 文档
|
||||||
|
README.md
|
||||||
|
|
||||||
|
# 测试(运行时不需)
|
||||||
|
tests/
|
||||||
76
Dockerfile
Normal file
76
Dockerfile
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
# Cocoon — 基于 coco 协程库的轻量级 Web 服务器
|
||||||
|
# 多阶段构建,最终镜像约 50MB
|
||||||
|
|
||||||
|
# ==================== 构建阶段 ====================
|
||||||
|
FROM debian:bookworm-slim AS builder
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
gcc \
|
||||||
|
make \
|
||||||
|
cmake \
|
||||||
|
git \
|
||||||
|
libssl-dev \
|
||||||
|
libbrotli-dev \
|
||||||
|
libnghttp2-dev \
|
||||||
|
libcurl4-openssl-dev \
|
||||||
|
liburing-dev \
|
||||||
|
zlib1g-dev \
|
||||||
|
ca-certificates \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /build
|
||||||
|
|
||||||
|
# 复制源码(包含子模块)
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# 初始化并更新子模块(如果通过 COPY 未包含)
|
||||||
|
RUN git submodule update --init --recursive || true
|
||||||
|
|
||||||
|
# 构建 coco 依赖
|
||||||
|
RUN make deps
|
||||||
|
|
||||||
|
# 构建 cocoon
|
||||||
|
RUN make COCO_INCLUDE=./coco/include COCO_LIB=./coco/build
|
||||||
|
|
||||||
|
# 验证二进制
|
||||||
|
RUN ./cocoon --help || true
|
||||||
|
|
||||||
|
# ==================== 运行阶段 ====================
|
||||||
|
FROM debian:bookworm-slim AS runner
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
libssl3 \
|
||||||
|
libbrotli1 \
|
||||||
|
libnghttp2-14 \
|
||||||
|
libcurl4 \
|
||||||
|
liburing2 \
|
||||||
|
zlib1g \
|
||||||
|
ca-certificates \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# 创建运行用户(非 root)
|
||||||
|
RUN groupadd -r cocoon && useradd -r -g cocoon -s /bin/false cocoon
|
||||||
|
|
||||||
|
# 创建工作目录
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# 复制二进制和默认配置
|
||||||
|
COPY --from=builder /build/cocoon /usr/local/bin/cocoon
|
||||||
|
COPY --from=builder /build/cocoon.json /app/cocoon.json
|
||||||
|
COPY --from=builder /build/examples /app/examples
|
||||||
|
COPY --from=builder /build/plugins /app/plugins
|
||||||
|
COPY --from=builder /build/cocoon.service /app/cocoon.service
|
||||||
|
|
||||||
|
# 设置权限
|
||||||
|
RUN chown -R cocoon:cocoon /app
|
||||||
|
|
||||||
|
# 健康检查
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
|
CMD curl -f http://localhost:8080/ || exit 1
|
||||||
|
|
||||||
|
USER cocoon
|
||||||
|
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
ENTRYPOINT ["cocoon"]
|
||||||
|
CMD ["-c", "/app/cocoon.json"]
|
||||||
16
Makefile
16
Makefile
@ -102,8 +102,8 @@ $(UNIT_TEST_DIR)/test_http: $(UNIT_TEST_DIR)/test_http.c http.c log.c $(UNITY_SR
|
|||||||
$(UNIT_TEST_DIR)/test_static: $(UNIT_TEST_DIR)/test_static.c http.c log.c tls.c access_log.c platform.c cache.c acme.c throttle.c $(UNITY_SRC)
|
$(UNIT_TEST_DIR)/test_static: $(UNIT_TEST_DIR)/test_static.c http.c log.c tls.c access_log.c platform.c cache.c acme.c throttle.c $(UNITY_SRC)
|
||||||
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_static.c http.c log.c tls.c access_log.c platform.c cache.c acme.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_static.c http.c log.c tls.c access_log.c platform.c cache.c acme.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
||||||
|
|
||||||
$(UNIT_TEST_DIR)/test_websocket: $(UNIT_TEST_DIR)/test_websocket.c websocket.c log.c platform.c $(UNITY_SRC)
|
$(UNIT_TEST_DIR)/test_websocket: $(UNIT_TEST_DIR)/test_websocket.c websocket.c log.c platform.c throttle.c $(UNITY_SRC)
|
||||||
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_websocket.c websocket.c log.c platform.c $(UNITY_SRC) $(LDFLAGS)
|
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_websocket.c websocket.c log.c platform.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
||||||
|
|
||||||
$(UNIT_TEST_DIR)/test_log: $(UNIT_TEST_DIR)/test_log.c log.c $(UNITY_SRC)
|
$(UNIT_TEST_DIR)/test_log: $(UNIT_TEST_DIR)/test_log.c log.c $(UNITY_SRC)
|
||||||
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_log.c log.c $(UNITY_SRC) -lm
|
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_log.c log.c $(UNITY_SRC) -lm
|
||||||
@ -123,16 +123,16 @@ $(UNIT_TEST_DIR)/test_middleware_ext: $(UNIT_TEST_DIR)/test_middleware_ext.c mid
|
|||||||
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_middleware_ext.c middleware_ext.c http.c log.c platform.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_middleware_ext.c middleware_ext.c http.c log.c platform.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
||||||
|
|
||||||
# gRPC 测试
|
# gRPC 测试
|
||||||
$(UNIT_TEST_DIR)/test_grpc: $(UNIT_TEST_DIR)/test_grpc.c grpc.c http.c log.c platform.c $(UNITY_SRC)
|
$(UNIT_TEST_DIR)/test_grpc: $(UNIT_TEST_DIR)/test_grpc.c grpc.c http.c log.c platform.c throttle.c $(UNITY_SRC)
|
||||||
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_grpc.c grpc.c http.c log.c platform.c $(UNITY_SRC) -lm
|
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_grpc.c grpc.c http.c log.c platform.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
||||||
|
|
||||||
# 负载均衡测试
|
# 负载均衡测试
|
||||||
$(UNIT_TEST_DIR)/test_load_balance: $(UNIT_TEST_DIR)/test_load_balance.c load_balance.c proxy.c proxy_tls.c http.c log.c platform.c throttle.c $(UNITY_SRC)
|
$(UNIT_TEST_DIR)/test_load_balance: $(UNIT_TEST_DIR)/test_load_balance.c load_balance.c proxy.c proxy_tls.c http.c log.c platform.c throttle.c $(UNITY_SRC)
|
||||||
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_load_balance.c load_balance.c proxy.c proxy_tls.c http.c log.c platform.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_load_balance.c load_balance.c proxy.c proxy_tls.c http.c log.c platform.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
||||||
|
|
||||||
# HTTP/3 测试
|
# HTTP/3 测试
|
||||||
$(UNIT_TEST_DIR)/test_http3: $(UNIT_TEST_DIR)/test_http3.c http3.c http.c log.c platform.c $(UNITY_SRC)
|
$(UNIT_TEST_DIR)/test_http3: $(UNIT_TEST_DIR)/test_http3.c http3.c http.c log.c platform.c throttle.c $(UNITY_SRC)
|
||||||
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_http3.c http3.c http.c log.c platform.c $(UNITY_SRC) $(LDFLAGS)
|
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_http3.c http3.c http.c log.c platform.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
||||||
|
|
||||||
# SSE 测试
|
# SSE 测试
|
||||||
$(UNIT_TEST_DIR)/test_sse: $(UNIT_TEST_DIR)/test_sse.c sse.c log.c $(UNITY_SRC)
|
$(UNIT_TEST_DIR)/test_sse: $(UNIT_TEST_DIR)/test_sse.c sse.c log.c $(UNITY_SRC)
|
||||||
@ -151,8 +151,8 @@ $(UNIT_TEST_DIR)/test_dashboard: $(UNIT_TEST_DIR)/test_dashboard.c dashboard.c s
|
|||||||
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_dashboard.c dashboard.c sse.c log.c $(UNITY_SRC) $(LDFLAGS)
|
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_dashboard.c dashboard.c sse.c log.c $(UNITY_SRC) $(LDFLAGS)
|
||||||
|
|
||||||
# ACME 测试
|
# ACME 测试
|
||||||
$(UNIT_TEST_DIR)/test_acme: $(UNIT_TEST_DIR)/test_acme.c acme.c log.c platform.c $(UNITY_SRC)
|
$(UNIT_TEST_DIR)/test_acme: $(UNIT_TEST_DIR)/test_acme.c acme.c log.c platform.c throttle.c $(UNITY_SRC)
|
||||||
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_acme.c acme.c log.c platform.c $(UNITY_SRC) $(LDFLAGS)
|
$(CC) $(CFLAGS) -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_acme.c acme.c log.c platform.c throttle.c $(UNITY_SRC) $(LDFLAGS)
|
||||||
|
|
||||||
# ACME 配置集成测试
|
# ACME 配置集成测试
|
||||||
$(UNIT_TEST_DIR)/test_acme_config: $(UNIT_TEST_DIR)/test_acme_config.c config.c acme.c log.c access_log.c http.c platform.c throttle.c $(UNITY_SRC)
|
$(UNIT_TEST_DIR)/test_acme_config: $(UNIT_TEST_DIR)/test_acme_config.c config.c acme.c log.c access_log.c http.c platform.c throttle.c $(UNITY_SRC)
|
||||||
|
|||||||
@ -245,7 +245,9 @@ static void test_acme_config_merge(void) {
|
|||||||
false, false, false, false, false, false,
|
false, false, false, false, false, false,
|
||||||
false, false, false, false, false,
|
false, false, false, false, false,
|
||||||
false, false, false, false,
|
false, false, false, false,
|
||||||
|
false,
|
||||||
false, false,
|
false, false,
|
||||||
|
false,
|
||||||
false, false, false, false,
|
false, false, false, false,
|
||||||
true); /* has_acme_enabled */
|
true); /* has_acme_enabled */
|
||||||
|
|
||||||
|
|||||||
@ -306,6 +306,7 @@ void test_merge_override_all(void) {
|
|||||||
};
|
};
|
||||||
config_merge(&base, &cmdline,
|
config_merge(&base, &cmdline,
|
||||||
true, true, true, true, true, true, true, true, true, true, true, true,
|
true, true, true, true, true, true, true, true, true, true, true, true,
|
||||||
|
false, false,
|
||||||
false, false, false, false, false, false, false, false, false, false);
|
false, false, false, false, false, false, false, false, false, false);
|
||||||
TEST_ASSERT_EQUAL_STRING("/new", base.root_dir);
|
TEST_ASSERT_EQUAL_STRING("/new", base.root_dir);
|
||||||
TEST_ASSERT_EQUAL(9090, base.port);
|
TEST_ASSERT_EQUAL(9090, base.port);
|
||||||
@ -336,6 +337,7 @@ void test_merge_no_override(void) {
|
|||||||
};
|
};
|
||||||
config_merge(&base, &cmdline,
|
config_merge(&base, &cmdline,
|
||||||
false, false, false, false, false, false, false, false, false, false, false, false,
|
false, false, false, false, false, false, false, false, false, false, false, false,
|
||||||
|
false, false,
|
||||||
false, false, false, false, false, false, false, false, false, false);
|
false, false, false, false, false, false, false, false, false, false);
|
||||||
TEST_ASSERT_EQUAL_STRING("/old", base.root_dir);
|
TEST_ASSERT_EQUAL_STRING("/old", base.root_dir);
|
||||||
TEST_ASSERT_EQUAL(8080, base.port);
|
TEST_ASSERT_EQUAL(8080, base.port);
|
||||||
@ -360,6 +362,7 @@ void test_merge_partial_override(void) {
|
|||||||
};
|
};
|
||||||
config_merge(&base, &cmdline,
|
config_merge(&base, &cmdline,
|
||||||
true, false, false, true, false, false, false, false, false, false, false, false,
|
true, false, false, true, false, false, false, false, false, false, false, false,
|
||||||
|
false, false,
|
||||||
false, false, false, false, false, false, false, false, false, false);
|
false, false, false, false, false, false, false, false, false, false);
|
||||||
TEST_ASSERT_EQUAL_STRING("/new", base.root_dir); /* overridden */
|
TEST_ASSERT_EQUAL_STRING("/new", base.root_dir); /* overridden */
|
||||||
TEST_ASSERT_EQUAL(8080, base.port); /* not overridden */
|
TEST_ASSERT_EQUAL(8080, base.port); /* not overridden */
|
||||||
@ -426,6 +429,7 @@ void test_merge_cmdline_null_root_dir(void) {
|
|||||||
cocoon_config_t base = {.root_dir = strdup("/old"), .port = 8080};
|
cocoon_config_t base = {.root_dir = strdup("/old"), .port = 8080};
|
||||||
cocoon_config_t cmdline = {.root_dir = NULL, .port = 9090};
|
cocoon_config_t cmdline = {.root_dir = NULL, .port = 9090};
|
||||||
config_merge(&base, &cmdline, true, true, false, false, false, false, false, false, false, false, false, false,
|
config_merge(&base, &cmdline, true, true, false, false, false, false, false, false, false, false, false, false,
|
||||||
|
false, false,
|
||||||
false, false, false, false, false, false, false, false, false, false);
|
false, false, false, false, false, false, false, false, false, false);
|
||||||
TEST_ASSERT_EQUAL_STRING("/old", base.root_dir); /* NULL 不覆盖 */
|
TEST_ASSERT_EQUAL_STRING("/old", base.root_dir); /* NULL 不覆盖 */
|
||||||
TEST_ASSERT_EQUAL(9090, base.port); /* port 覆盖 */
|
TEST_ASSERT_EQUAL(9090, base.port); /* port 覆盖 */
|
||||||
@ -435,6 +439,7 @@ void test_merge_cmdline_null_root_dir(void) {
|
|||||||
void test_merge_null_safety(void) {
|
void test_merge_null_safety(void) {
|
||||||
/* 不应 crash */
|
/* 不应 crash */
|
||||||
config_merge(NULL, NULL, true, true, true, true, true, true, true, true, true, true, true, true,
|
config_merge(NULL, NULL, true, true, true, true, true, true, true, true, true, true, true, true,
|
||||||
|
false, false,
|
||||||
true, true, true, true, true, true, true, true, false, false);
|
true, true, true, true, true, true, true, true, false, false);
|
||||||
TEST_ASSERT_TRUE(1);
|
TEST_ASSERT_TRUE(1);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user