NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
reverse_proxy.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_HTTP_REVERSE_PROXY_HPP__
2#define NEFORCE_NETWORK_HTTP_REVERSE_PROXY_HPP__
7
13NEFORCE_BEGIN_NAMESPACE__
14NEFORCE_BEGIN_HTTP__
15
20
26 string host;
27 ports port;
28 string scheme{"http"};
29 size_t weight{1};
30 bool enabled{true};
31
32 NEFORCE_NODISCARD string to_url(const string& path) const {
33 return scheme + "://" + host + ":" + to_string(port.value()) + path;
34 }
35};
36
52class NEFORCE_API reverse_proxy_filter final : public http_filter {
53public:
58
66 bool follow_redirects{false};
69
75 ctx_(&ctx) {}
76
81 reverse_proxy_filter(io_context& ctx, string host, ports port, string scheme = "http") :
82 ctx_(&ctx) {
83 add_backend({move(host), port, move(scheme)});
84 }
85
89 void add_backend(proxy_backend backend) {
90 lock<mutex> lk(mutex_);
91 backends_.push_back(move(backend));
92 }
93
97 void set_path_prefix(string prefix) {
98 lock<mutex> lk(mutex_);
99 path_prefix_ = move(prefix);
100 }
101
106 lock<mutex> lk(mutex_);
107 selector_ = move(selector);
108 }
109
114 lock<mutex> lk(mutex_);
115 header_rewrite_ = move(cb);
116 }
117
121 void add_skip_response_header(string header) {
122 lock<mutex> lk(mutex_);
123 skip_resp_headers_.push_back(move(header));
124 }
125
126 bool pre_filter(http_request& request, http_response& response) override;
127 void do_filter(http_request& request, http_response& response) override {}
128 NEFORCE_NODISCARD string name() const override { return "reverse_proxy_filter"; }
129
130private:
131 io_context* ctx_{nullptr};
132 vector<proxy_backend> backends_;
133 string path_prefix_;
134 backend_selector_cb selector_;
135 header_rewrite_cb header_rewrite_;
136 vector<string> skip_resp_headers_;
137 mutable mutex mutex_;
138 size_t rr_counter_{0};
139
140 proxy_backend select_backend(const http_request& request);
141 bool should_proxy(const string& path) const;
142 http_client_response forward(const proxy_backend& backend, const http_request& request);
143 void copy_response(const http_client_response& from, http_response& to);
144
145 // TODO: WebSocket proxy — tunnel WebSocket connections through to backend with bidirectional frame forwarding
146 // TODO: Response body transformation — modify/rewrite proxied response bodies (e.g., URL rewriting for CDN paths)
147};
148 // HTTP
150
151NEFORCE_END_HTTP__
152NEFORCE_END_NAMESPACE__
153#endif // NEFORCE_NETWORK_HTTP_REVERSE_PROXY_HPP__
函数包装器主模板声明
void set_header_rewrite(header_rewrite_cb cb)
设置请求头重写回调
bool pre_filter(http_request &request, http_response &response) override
预处理方法
string name() const override
获取过滤器名称
reverse_proxy_filter(io_context &ctx, string host, ports port, string scheme="http")
构造函数(单后端)
function< void(unordered_map< string, string > &)> header_rewrite_cb
请求头重写回调
bool passthrough_host_header
是否保持原始 Host 头(不过滤)
void do_filter(http_request &request, http_response &response) override
核心过滤方法
void add_backend(proxy_backend backend)
添加后端服务器
bool follow_redirects
是否跟随重定向
reverse_proxy_filter(io_context &ctx)
构造函数
void set_path_prefix(string prefix)
设置路径前缀匹配(仅代理匹配路径)
void add_skip_response_header(string header)
添加不透传的响应头
void set_backend_selector(backend_selector_cb selector)
设置自定义后端选择器
milliseconds connect_timeout
连接超时(毫秒)
function< proxy_backend(const http_request &)> backend_selector_cb
后端选择回调
milliseconds send_timeout
发送超时(毫秒)
milliseconds receive_timeout
接收超时(毫秒)
统一异步操作核心
锁管理器模板
非递归互斥锁
文件路径类
动态大小数组容器
通用函数包装器
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
duration< int64_t, milli > milliseconds
毫秒持续时间
http_server_response http_response
HTTP响应类型别名
http_server_request http_request
HTTP请求类型别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr string to_string(const CharT &c)
将字符转换为普通字符串
HTTP客户端实现
HTTP过滤器链实现
互斥锁
反向代理后端服务器配置
size_t weight
权重(用于加权负载均衡)
string scheme
"http" 或 "https"
网络端口封装类
无序映射容器