NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
http_server.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_HTTP_HTTP_SERVER_HPP__
2#define NEFORCE_NETWORK_HTTP_HTTP_SERVER_HPP__
3
21
29NEFORCE_BEGIN_NAMESPACE__
30NEFORCE_BEGIN_HTTP__
31
36
71class NEFORCE_API http_server {
72public:
74
81 struct NEFORCE_API session_manager {
83 mutable mutex mutex_;
88 size_t max_sessions_{10000};
89
92
93 session_manager(const session_manager&) = delete;
94 session_manager& operator=(const session_manager&) = delete;
95
96 session_manager(session_manager&&) noexcept = delete;
97 session_manager& operator=(session_manager&&) noexcept = delete;
98
99 http_session* get_session(const string& session_id, bool create = true);
100 void remove_session(const string& session_id) noexcept;
101 void cleanup_expired_sessions();
102 bool session_exists(const string& session_id) const noexcept;
103
104 size_t session_count() const noexcept;
105 void set_cleanup_interval(seconds interval) noexcept;
106 void set_max_sessions(size_t max) noexcept;
107 };
108
109private:
110 io_context* ctx_{nullptr};
112 vector<thread> h2c_threads_;
113 mutable mutex h2c_mutex_;
114 http_router router_;
115 websocket_server ws_server_;
116 session_manager session_manager_;
117 sni_manager sni_;
118
120 unique_ptr<http::session_store> session_store_;
121
122 mutable mutex conn_mutex_;
123 unordered_map<string, size_t> conn_per_ip_;
124
125 static http_request parse_request(tcp_socket* client_socket, session_manager& manager, const http_cookie_name& name,
126 byte_size max_header_size, byte_size max_body_size, size_t max_header_count,
127 milliseconds body_read_timeout);
128
129 static http_session* get_or_create_session(http_request& request, bool create, session_manager& manager,
130 const http_cookie_name& name);
131
132public:
135 bool enable_websocket{true};
136 bool enable_connect{true};
137
139 size_t max_header_count{100};
140 size_t max_h2c_upgrades{32};
142
143 // TODO: HTTP/3 (QUIC) protocol support — integrate QUIC transport (RFC 9114) for 0-RTT, reduced head-of-line blocking
144 // TODO: Configuration file support — load server settings from YAML/JSON config files (port, SSL, worker_count, limits)
145 // TODO: Server-sent events (SSE) — add SSE stream support for unidirectional real-time data push to browsers
146 // TODO: Actuator-style management endpoints — /actuator/metrics, /actuator/env, /actuator/loggers, /actuator/threaddump
147 // TODO: Hot reload / DevTools — watch static file directory for changes and notify connected browsers (LiveReload)
148
149private:
150 unordered_map<string, function<bool(http_request&, tcp_socket*)>> upgrade_handlers_;
151
152 void handle_client(unique_ptr<tcp_socket> client_socket);
153 bool try_upgrade(unique_ptr<tcp_socket>& client_socket, http_request& request);
154 void handle_connect(const unique_ptr<tcp_socket>& client_socket, http_request& request);
155 void handle_request_with_forward(tcp_socket& client_socket, http_request& request, http_session* sess);
156
157public:
164 explicit http_server(ports port, io_context& ioc, size_t worker_count = 0);
165
173 http_server(ports port, io_context& ioc, ssl_context ctx, size_t worker_count = 0);
174
175 ~http_server();
176
177 http_server(const http_server&) = delete;
178 http_server& operator=(const http_server&) = delete;
179
180 http_server(http_server&&) noexcept = delete;
181 http_server& operator=(http_server&&) noexcept = delete;
182
189 bool load_certificate(const string& cert_file, const string& key_file);
190
199 void add_sni_host(const string& hostname, ssl_context ctx) { sni_.add_host(hostname, move(ctx)); }
200
205 NEFORCE_NODISCARD sni_manager& sni() noexcept { return sni_; }
206
211 NEFORCE_NODISCARD const sni_manager& sni() const noexcept { return sni_; }
212
217 NEFORCE_NODISCARD http_router& router() noexcept { return router_; }
218
223 NEFORCE_NODISCARD const http_router& router() const noexcept { return router_; }
224
229 NEFORCE_NODISCARD websocket_server& websocket() noexcept { return ws_server_; }
230
235 NEFORCE_NODISCARD const websocket_server& websocket() const noexcept { return ws_server_; }
236
241 void set_cookie_name(http_cookie_name name) noexcept { cookie_name_ = move(name); }
242
250 void set_session_store(unique_ptr<session_store> store) noexcept { session_store_ = move(store); }
251
256 NEFORCE_NODISCARD http::session_store* session_store() noexcept { return session_store_.get(); }
257
262 NEFORCE_NODISCARD const http_cookie_name& cookie_name() const noexcept { return cookie_name_; }
263
268 void set_session_cleanup_interval(seconds interval) noexcept { session_manager_.set_cleanup_interval(interval); }
269
274 void set_max_sessions(size_t max) noexcept { session_manager_.set_max_sessions(max); }
275
284 void set_upgrade_handler(string protocol, function<bool(http_request&, tcp_socket*)> handler) {
285 upgrade_handlers_[move(protocol)] = move(handler);
286 }
287
292 NEFORCE_NODISCARD ports port() const noexcept { return server_->port(); }
293
298 NEFORCE_NODISCARD bool is_running() const noexcept { return server_->is_running(); }
299
306 NEFORCE_NODISCARD http_session* get_session(http_request& request, bool create = false);
307
313 bool start(int backlog = SOMAXCONN) { return server_->start(backlog); }
314
318 void stop() noexcept { server_->stop(); }
319
324 NEFORCE_NODISCARD tcp_server_base* server() noexcept { return server_.get(); }
325
330 NEFORCE_NODISCARD const tcp_server_base* server() const noexcept { return server_.get(); }
331};
332 // HTTP
334
335NEFORCE_END_HTTP__
336NEFORCE_END_NAMESPACE__
337#endif // NEFORCE_NETWORK_HTTP_HTTP_SERVER_HPP__
函数包装器主模板声明
void set_max_sessions(size_t max) noexcept
设置最大会话数
http_server(ports port, io_context &ioc, ssl_context ctx, size_t worker_count=0)
构造HTTPS服务器
bool enable_websocket
是否启用WebSocket
void add_sni_host(const string &hostname, ssl_context ctx)
添加SNI多域名证书
void set_session_cleanup_interval(seconds interval) noexcept
设置会话清理间隔
tcp_socket socket_type
Socket类型
bool enable_connect
是否启用CONNECT隧道
const tcp_server_base * server() const noexcept
获取底层服务器常量指针
milliseconds body_read_timeout
请求体读取超时(毫秒)
byte_size max_server_body_size
最大请求体大小
void stop() noexcept
停止服务器
void set_session_store(unique_ptr< session_store > store) noexcept
设置自定义会话存储后端
sni_manager & sni() noexcept
获取SNI管理器
websocket_server & websocket() noexcept
获取WebSocket服务器引用
void set_cookie_name(http_cookie_name name) noexcept
设置会话Cookie名称
bool is_running() const noexcept
检查服务器是否运行中
size_t max_connections_per_ip
每IP最大连接数(0=不限制)
byte_size max_server_header_size
最大请求头大小
const websocket_server & websocket() const noexcept
获取WebSocket服务器常量引用
bool load_certificate(const string &cert_file, const string &key_file)
加载SSL证书
tcp_server_base * server() noexcept
获取底层服务器指针
bool start(int backlog=SOMAXCONN)
启动服务器
size_t max_header_count
最大请求头数量
http_server(ports port, io_context &ioc, size_t worker_count=0)
构造HTTP服务器
const http_cookie_name & cookie_name() const noexcept
获取会话Cookie名称
const sni_manager & sni() const noexcept
获取SNI管理器常量引用
void set_upgrade_handler(string protocol, function< bool(http_request &, tcp_socket *)> handler)
注册协议升级处理器
const http_router & router() const noexcept
获取路由器常量引用
ports port() const noexcept
获取监听端口
size_t max_h2c_upgrades
最大h2c升级连接数
http_session * get_session(http_request &request, bool create=false)
获取会话(从请求中)
http_router & router() noexcept
获取路由器引用
http::session_store * session_store() noexcept
获取会话存储后端
统一异步操作核心
非递归互斥锁
SNI (Server Name Indication) 证书管理器
SSL/TLS上下文管理类
独占智能指针
动态大小数组容器
条件变量行为
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
duration< int64_t > seconds
秒持续时间
duration< int64_t, milli > milliseconds
毫秒持续时间
http_server_request http_request
HTTP请求类型别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string< char > string
字符字符串
HTTP路由器实现
统一异步操作核心
可插拔会话存储抽象层
SNI 证书管理器
通用原子类型模板
unordered_map< string, http_session > sessions_
会话存储
atomic< bool > cleanup_running_
清理线程运行标志
网络端口封装类
raw port
端口值
TCP服务器实现
WebSocket协议实现