/** * static.h - 静态资源服务模块接口 * * @author xfy */ #ifndef COCOON_STATIC_H #define COCOON_STATIC_H #include "http.h" #include #include "cache.h" /** * send_all - 确保缓冲区全部发送 * * 使用 write 循环发送,直到全部数据发送完毕或遇到不可恢复错误。 * 内部辅助函数,也可被其他模块调用。 * * @param fd socket 文件描述符 * @param buf 数据缓冲区 * @param len 数据长度 * @return 0 成功,-1 失败 */ int send_all(int fd, const char *buf, size_t len); /** * static_serve_file - 服务单个静态文件 * * 打开文件,根据请求判断是否需要发送部分内容(Range), * 然后通过 sendfile 或循环读取发送文件内容。 * * 如果 cache 不为 NULL,且文件大小不超过缓存上限, * 则尝试读取完整文件内容到内存缓存,避免重复磁盘 I/O。 * * @param fd 客户端 socket 文件描述符 * @param req HTTP 请求 * @param root_dir 静态资源根目录 * @param gzip_enabled 是否启用 gzip 压缩 * @param brotli_enabled 是否启用 brotli 压缩 * @param cache 内存缓存实例(可为 NULL) * @return COCOON_OK 成功,负值错误码 */ int static_serve_file(int fd, const http_request_t *req, const char *root_dir, bool gzip_enabled, bool brotli_enabled, cocoon_cache_t *cache); /** * static_serve_directory - 生成目录列表 HTML * * 当请求路径是目录且不含默认 index.html 时,生成美观的目录浏览页面。 * * @param fd 客户端 socket 文件描述符 * @param req HTTP 请求 * @param root_dir 静态资源根目录 * @param real_path 文件系统上的真实路径 * @return COCOON_OK 成功,负值错误码 */ int static_serve_directory(int fd, const http_request_t *req, const char *root_dir, const char *real_path); /** * static_send_error - 发送 HTTP 错误响应 * * @param fd 客户端 socket * @param status_code HTTP 状态码(如 404、403) * @param keep_alive 是否保持连接 * @return COCOON_OK 成功 */ int static_send_error(int fd, int status_code, bool keep_alive); /** * static_set_cors - 设置是否启用 CORS 响应头 * * 全局开关,启用后所有 HTTP 响应自动添加 Access-Control-Allow-Origin: *。 * * @param enabled true 启用,false 禁用 */ void static_set_cors(bool enabled); #endif /* COCOON_STATIC_H */