cocoon/proxy.h
xfy911 acda3b9c3e feat(proxy): 反向代理负载均衡(轮询 + 故障转移)
- proxy.h: 重构数据结构,支持多后端(cocoon_proxy_backend_t)
- proxy.c: 实现轮询调度 + 自动故障转移(后端失败时尝试下一个)
- proxy.c: proxy_add_rule 支持同 prefix 追加后端,自动合并为多后端规则
- server.c: 匹配 proxy.h 新签名
- 编译零警告,142 单元测试 + 82 集成测试全部通过
2026-06-08 16:15:51 +08:00

88 lines
2.3 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.

/**
* proxy.h - 反向代理模块
*
* 轻量级反向代理,支持路径前缀匹配到目标后端。
*
* @author xfy
*/
#ifndef COCOON_PROXY_H
#define COCOON_PROXY_H
#include "cocoon.h"
#include "http.h"
#include "platform.h"
#include <stdbool.h>
#define COCOON_MAX_PROXY_BACKENDS 8
/**
* cocoon_proxy_backend_t - 单个后端服务器配置
*/
typedef struct {
char target_host[256];
char target_path[256];
uint16_t target_port;
bool target_https;
} cocoon_proxy_backend_t;
/**
* cocoon_proxy_rule_t - 代理规则(支持多后端)
*/
typedef struct {
char path_prefix[256];
cocoon_proxy_backend_t backends[COCOON_MAX_PROXY_BACKENDS];
size_t backend_count;
size_t current_index; /* 轮询索引 */
} cocoon_proxy_rule_t;
typedef struct {
cocoon_proxy_rule_t rules[COCOON_MAX_PROXY_RULES];
size_t count;
} cocoon_proxy_config_t;
/**
* proxy_init - 初始化代理配置
*/
void proxy_init(cocoon_proxy_config_t *cfg);
/**
* proxy_add_rule - 添加代理规则或向后端追加
*
* 如果 prefix 已存在,将 target 追加为同一规则的新后端。
* 如果 prefix 不存在,创建新规则。
*
* @param cfg 代理配置
* @param prefix 路径前缀(如 "/api/"
* @param target_url 目标URL如 "http://localhost:3000"
* @return true 成功
*/
bool proxy_add_rule(cocoon_proxy_config_t *cfg, const char *prefix, const char *target_url);
/**
* proxy_match - 查找匹配路径的代理规则
*
* @param cfg 代理配置
* @param path 请求路径
* @return 匹配的规则,未匹配返回 NULL
*/
cocoon_proxy_rule_t *proxy_match(cocoon_proxy_config_t *cfg, const char *path);
/**
* proxy_forward - 将请求转发到目标后端(轮询+failover
*
* 使用轮询算法选择后端,当前后端失败时自动尝试下一个。
* 建立到后端的连接,转发请求,将响应回写给客户端。
*
* @param client_fd 客户端 socket
* @param req HTTP 请求
* @param rule 代理规则
* @param client_addr 客户端地址(用于 X-Forwarded-For
* @return true 保持连接false 关闭
*/
bool proxy_forward(cocoon_socket_t client_fd, const http_request_t *req,
cocoon_proxy_rule_t *rule,
const struct sockaddr_storage *client_addr);
#endif /* COCOON_PROXY_H */