docs: 为 config.c、log.c、tls.c 添加函数级 Doxygen 注释

- config.c: 为 JSON 解析器内部函数和公共 API 添加完整注释
- log.c: 为日志级别转换和输出函数添加注释
- tls.c: 为 TLS 连接管理、Memory BIO 操作和 ALPN 回调添加注释
- http2.c: 移除过时的 TODO 占位注释(请求体收集已实现)
This commit is contained in:
xfy911 2026-06-07 09:05:45 +08:00
parent 3762343889
commit 9da9bd9449
4 changed files with 270 additions and 7 deletions

View File

@ -51,6 +51,13 @@ typedef struct {
/* === 内部parser 辅助函数 === */
/**
* parser_init - JSON
*
* @param p
* @param src JSON
* @param len
*/
static void parser_init(parser_t *p, const char *src, size_t len) {
p->src = src;
p->pos = 0;
@ -58,6 +65,13 @@ static void parser_init(parser_t *p, const char *src, size_t len) {
p->line = 1;
}
/**
* parser_skip_ws -
*
* // 行注释。
*
* @param p
*/
static void parser_skip_ws(parser_t *p) {
while (p->pos < p->len) {
char c = p->src[p->pos];
@ -76,6 +90,15 @@ static void parser_skip_ws(parser_t *p) {
}
}
/**
* parser_next_token - JSON token
*
* token truefalse
* { } [ ] , :
*
* @param p
* @return token
*/
static token_t parser_next_token(parser_t *p) {
parser_skip_ws(p);
token_t t = {TOKEN_INVALID, NULL, 0, p->line};
@ -139,12 +162,26 @@ static token_t parser_next_token(parser_t *p) {
}
}
/**
* token_expect - token
*
* @param p
* @param expected token
* @return true false
*/
static bool token_expect(parser_t *p, token_type_t expected) {
token_t t = parser_next_token(p);
return t.type == expected;
}
/* 复制 token 内容为 C 字符串(处理转义) */
/**
* token_str_dup - token C
*
* JSON \n \t \r \\ \")。
*
* @param t token
* @return C NULL
*/
static char *token_str_dup(const token_t *t) {
char *buf = (char *)malloc(t->len + 1);
if (!buf) return NULL;
@ -169,6 +206,12 @@ static char *token_str_dup(const token_t *t) {
return buf;
}
/**
* token_to_long - token
*
* @param t token
* @return
*/
static long token_to_long(const token_t *t) {
char buf[32] = {0};
size_t n = t->len < 31 ? t->len : 31;
@ -176,6 +219,12 @@ static long token_to_long(const token_t *t) {
return strtol(buf, NULL, 10);
}
/**
* str_to_log_level -
*
* @param str error/warn/info/debug
* @return LOG_LEVEL_INFO
*/
static log_level_t str_to_log_level(const char *str) {
if (strcmp(str, "error") == 0) return LOG_LEVEL_ERROR;
if (strcmp(str, "warn") == 0) return LOG_LEVEL_WARN;
@ -186,6 +235,21 @@ static log_level_t str_to_log_level(const char *str) {
/* === 公共 API === */
/**
* config_load_from_file - JSON
*
* cocoon.json
* root_dir, port, threaded, num_workers, max_connections, timeout_ms,
* log_level, gzip_enabled, brotli_enabled, tls_cert, tls_key, tls_enabled,
* access_log, cors_enabled, auth_user, auth_pass, rate_limit,
* plugins, proxies
*
* 便
*
* @param path
* @param config
* @return true false stderr
*/
bool config_load_from_file(const char *path, cocoon_config_t *config) {
if (!path || !config) return false;
@ -423,6 +487,32 @@ bool config_load_from_file(const char *path, cocoon_config_t *config) {
return true;
}
/**
* config_merge -
*
*
*
*
* @param base
* @param cmdline
* @param has_root_dir root_dir
* @param has_port port
* @param has_workers num_workers
* @param has_max_conn max_connections
* @param has_timeout timeout_ms
* @param has_log_level log_level
* @param has_gzip_enabled gzip_enabled
* @param has_brotli_enabled brotli_enabled
* @param has_tls_cert tls_cert
* @param has_tls_key tls_key
* @param has_tls_enabled tls_enabled
* @param has_access_log access_log
* @param has_cors_enabled cors_enabled
* @param has_auth_user auth_user
* @param has_auth_pass auth_pass
* @param has_rate_limit rate_limit
* @param has_plugins plugins
*/
void config_merge(cocoon_config_t *base, const cocoon_config_t *cmdline,
bool has_root_dir, bool has_port, bool has_workers,
bool has_max_conn, bool has_timeout, bool has_log_level,

View File

@ -689,7 +689,7 @@ static int on_stream_close_callback(nghttp2_session *session __attribute__((unus
/**
* on_data_chunk_recv_callback - DATA
*
* TODO
* Content-Length
*
* @param session nghttp2 使
* @param flags 使

49
log.c
View File

@ -13,6 +13,12 @@
static log_level_t g_level = LOG_LEVEL_INFO;
static const char *g_prefix = "[Cocoon]";
/**
* level_str -
*
* @param level
* @return ERROR/WARN/INFO/DEBUG/UNKNOWN
*/
static const char *level_str(log_level_t level) {
switch (level) {
case LOG_LEVEL_ERROR: return "ERROR";
@ -23,18 +29,45 @@ static const char *level_str(log_level_t level) {
}
}
/**
* log_set_level -
*
*
*
* @param level
*/
void log_set_level(log_level_t level) {
g_level = level;
}
/**
* log_set_prefix -
*
* @param prefix NULL
*/
void log_set_prefix(const char *prefix) {
g_prefix = prefix;
}
/**
* log_get_level -
*
* @return
*/
log_level_t log_get_level(void) {
return g_level;
}
/**
* log_output -
*
* stderr
*
*
* @param level
* @param fmt
* @param args
*/
static void log_output(log_level_t level, const char *fmt, va_list args) {
if (level > g_level) return;
@ -52,6 +85,10 @@ static void log_output(log_level_t level, const char *fmt, va_list args) {
fprintf(stderr, "\n");
}
/**
* log_error - ERROR
* @param fmt
*/
void log_error(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
@ -59,6 +96,10 @@ void log_error(const char *fmt, ...) {
va_end(args);
}
/**
* log_warn - WARN
* @param fmt
*/
void log_warn(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
@ -66,6 +107,10 @@ void log_warn(const char *fmt, ...) {
va_end(args);
}
/**
* log_info - INFO
* @param fmt
*/
void log_info(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
@ -73,6 +118,10 @@ void log_info(const char *fmt, ...) {
va_end(args);
}
/**
* log_debug - DEBUG
* @param fmt
*/
void log_debug(const char *fmt, ...) {
va_list args;
va_start(args, fmt);

134
tls.c
View File

@ -33,12 +33,27 @@ static tls_conn_t **g_map = NULL;
static int g_map_cap = 0;
static SSL_CTX *g_ctx = NULL;
/* 内部O(1) fd 查表 */
/**
* tls_lookup - fd TLS
*
* O(1) 使
*
* @param fd socket
* @return TLS NULL
*/
static tls_conn_t* tls_lookup(int fd) {
if (fd >= 0 && fd < g_map_cap) return g_map[fd];
return NULL;
}
/**
* tls_map_set - fd TLS
*
*
*
* @param fd socket
* @param t TLS
*/
static void tls_map_set(int fd, tls_conn_t *t) {
if (fd >= g_map_cap) {
int old_cap = g_map_cap;
@ -49,11 +64,25 @@ static void tls_map_set(int fd, tls_conn_t *t) {
g_map[fd] = t;
}
/**
* tls_map_clear - fd TLS
*
* @param fd socket
*/
static void tls_map_clear(int fd) {
if (fd >= 0 && fd < g_map_cap) g_map[fd] = NULL;
}
/* 内部:从 socket 读取原始数据(协程感知) */
/**
* socket_read - socket
*
* 使 coco_read使 read
*
* @param fd socket
* @param buf
* @param len
* @return -1
*/
static ssize_t socket_read(int fd, void *buf, size_t len) {
if (coco_sched_get_current() != NULL) {
return coco_read(fd, buf, len);
@ -61,7 +90,16 @@ static ssize_t socket_read(int fd, void *buf, size_t len) {
return read(fd, buf, len);
}
/* 内部:向 socket 写入原始数据 */
/**
* socket_write_all - socket
*
* 使 coco_write
*
* @param fd socket
* @param buf
* @param len
* @return -1
*/
static ssize_t socket_write_all(int fd, const void *buf, size_t len) {
if (coco_sched_get_current() != NULL) {
size_t sent = 0;
@ -94,7 +132,13 @@ static ssize_t socket_write_all(int fd, const void *buf, size_t len) {
}
}
/* 内部:将 write BIO 中的加密数据刷到 socket */
/**
* flush_wbio - write BIO socket
*
* @param fd socket
* @param wbio write BIO
* @return 0 -1
*/
static int flush_wbio(int fd, BIO *wbio) {
char buf[16384];
int pending = BIO_read(wbio, buf, sizeof(buf));
@ -105,7 +149,19 @@ static int flush_wbio(int fd, BIO *wbio) {
return 0;
}
/* 内部ALPN 选择回调,优先选择 h2否则 http/1.1 */
/**
* tls_alpn_select_cb - ALPN
*
* h2HTTP/2 http/1.1
*
* @param ssl SSL 使
* @param out
* @param outlen
* @param in ALPN
* @param inlen ALPN
* @param arg 使
* @return SSL_TLSEXT_ERR_OK SSL_TLSEXT_ERR_NOACK
*/
static int tls_alpn_select_cb(SSL *ssl __attribute__((unused)), const unsigned char **out,
unsigned char *outlen, const unsigned char *in,
unsigned int inlen, void *arg __attribute__((unused))) {
@ -146,6 +202,16 @@ static int tls_alpn_select_cb(SSL *ssl __attribute__((unused)), const unsigned c
/* ===== 公共 API ===== */
/**
* tls_create_context - TLS
*
* OpenSSL ALPN
* TLS 1.2
*
* @param cert_path PEM
* @param key_path PEM
* @return 0 -1
*/
int tls_create_context(const char *cert_path, const char *key_path) {
if (!cert_path || !key_path) return -1;
@ -193,6 +259,11 @@ int tls_create_context(const char *cert_path, const char *key_path) {
return 0;
}
/**
* tls_destroy_context - TLS
*
* SSL_CTX TLS
*/
void tls_destroy_context(void) {
if (g_ctx) {
SSL_CTX_free(g_ctx);
@ -213,10 +284,24 @@ void tls_destroy_context(void) {
}
}
/**
* tls_has_context - TLS
*
* @return true false
*/
bool tls_has_context(void) {
return g_ctx != NULL;
}
/**
* tls_accept - TLS
*
* fd TLS
* 使 Memory BIO I/O
*
* @param fd socket
* @return 0 -1
*/
int tls_accept(int fd) {
if (!g_ctx) return -1;
@ -287,6 +372,16 @@ fail:
return -1;
}
/**
* tls_read - TLS
*
* SSL socket
*
* @param fd socket
* @param buf
* @param len
* @return 0 -1
*/
ssize_t tls_read(int fd, void *buf, size_t len) {
tls_conn_t *t = tls_lookup(fd);
if (!t || !t->ssl) return -1;
@ -315,6 +410,16 @@ ssize_t tls_read(int fd, void *buf, size_t len) {
}
}
/**
* tls_write - TLS
*
* SSL socket
*
* @param fd socket
* @param buf
* @param len
* @return -1
*/
ssize_t tls_write(int fd, const void *buf, size_t len) {
tls_conn_t *t = tls_lookup(fd);
if (!t || !t->ssl) return -1;
@ -346,6 +451,13 @@ ssize_t tls_write(int fd, const void *buf, size_t len) {
return (ssize_t)total;
}
/**
* tls_close - TLS
*
* close_notify SSL
*
* @param fd socket
*/
void tls_close(int fd) {
tls_conn_t *t = tls_lookup(fd);
if (!t) return;
@ -362,10 +474,22 @@ void tls_close(int fd) {
free(t);
}
/**
* tls_has_connection - fd TLS
*
* @param fd socket
* @return true TLS false
*/
bool tls_has_connection(int fd) {
return tls_lookup(fd) != NULL;
}
/**
* tls_negotiated_http2 - ALPN HTTP/2
*
* @param fd socket
* @return true h2false http/1.1
*/
bool tls_negotiated_http2(int fd) {
tls_conn_t *t = tls_lookup(fd);
if (!t || !t->ssl) return false;