cocoon/http.h
xfy911 0dc2bb5b4e feat(server): 连接空闲超时 + 最大并发限制 + 分级日志
- 新增 log.c/log.h 分级日志系统(error/warn/info/debug)
- 新增连接空闲超时管理:使用 coco_timer + shutdown + coco_cancel
  自动清理长时间无数据的僵尸连接,默认 30 秒
- 新增最大并发连接数限制(-m <num>),超限返回 503
- 命令行新增选项:-m 最大连接数, -o 超时毫秒, -l 日志级别
- 替换所有 printf 为 log_info/log_error/log_debug 等分级输出
- 编译通过,单线程/多线程模式均正常
2026-06-03 18:13:29 +08:00

119 lines
2.7 KiB
C
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.

/**
* http.h - HTTP 解析模块接口
*
* 提供 HTTP 请求解析和响应构建的接口。
*
* @author xfy
*/
#ifndef COCOON_HTTP_H
#define COCOON_HTTP_H
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
/* === HTTP 方法 === */
typedef enum {
HTTP_GET,
HTTP_HEAD,
HTTP_POST,
HTTP_PUT,
HTTP_DELETE,
HTTP_OPTIONS,
HTTP_UNKNOWN
} http_method_t;
/* === HTTP 请求 === */
#define HTTP_MAX_PATH 4096
#define HTTP_MAX_HEADERS 32
#define HTTP_HEADER_NAME_MAX 64
#define HTTP_HEADER_VALUE_MAX 1024
typedef struct {
http_method_t method;
char path[HTTP_MAX_PATH];
char version[16];
/* 请求头 */
struct {
char name[HTTP_HEADER_NAME_MAX];
char value[HTTP_HEADER_VALUE_MAX];
} headers[HTTP_MAX_HEADERS];
int num_headers;
/* 常用头快速访问 */
int64_t content_length;
bool keep_alive;
bool has_range;
int64_t range_start;
int64_t range_end;
/* 缓存相关头 */
char if_none_match[64];
char if_modified_since[64];
bool has_if_none_match;
bool has_if_modified_since;
/* 压缩相关头 */
bool accept_gzip; /* 客户端支持 gzip */
bool accept_deflate; /* 客户端支持 deflate */
bool has_accept_encoding;
} http_request_t;
/* === HTTP 响应 === */
typedef struct {
int status_code;
const char *status_text;
const char *content_type;
int64_t content_length;
bool keep_alive;
bool has_range;
int64_t range_start;
int64_t range_end;
int64_t total_length;
/* 缓存 */
const char *etag;
const char *last_modified;
} http_response_t;
/* === API === */
/**
* http_parse_request - 从缓冲区解析 HTTP 请求
*
* @param buf 输入缓冲区
* @param len 缓冲区长度
* @param req 输出请求结构体
* @return 成功解析的字节数,< 0 表示错误(-1 = 不完整,-2 = 格式错误)
*/
int http_parse_request(const char *buf, size_t len, http_request_t *req);
/**
* http_format_response_header - 格式化响应头到缓冲区
*
* @param buf 输出缓冲区
* @param buf_size 缓冲区大小
* @param resp 响应信息
* @return 写入的字节数,< 0 表示缓冲区不足
*/
int http_format_response_header(char *buf, size_t buf_size, const http_response_t *resp);
/**
* http_method_str - HTTP 方法转字符串
*
* @param method HTTP 方法
* @return 方法字符串(如 "GET"
*/
const char *http_method_str(http_method_t method);
/**
* http_mime_type - 根据文件扩展名获取 MIME 类型
*
* @param path 文件路径
* @return MIME 类型字符串
*/
const char *http_mime_type(const char *path);
#endif /* COCOON_HTTP_H */