NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
http_client.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_HTTP_HTTP_CLIENT_HPP__
2#define NEFORCE_NETWORK_HTTP_HTTP_CLIENT_HPP__
3
11
18NEFORCE_BEGIN_NAMESPACE__
19NEFORCE_BEGIN_HTTP__
20
25
81class NEFORCE_API http_client {
82public:
87 struct config {
92 bool follow_redirects = true;
93 bool keep_alive = false;
94 bool verify_ssl = true;
98 string user_agent{"NexusForce HTTP Client/1.0"};
99 string proxy_host;
101 // TODO: Connection pool — max_connections_per_host, idle_timeout, max_idle_connections
102 // TODO: Retry policy — max_retries, retry_backoff_ms, retry_on_status_codes (429, 502, 503, 504)
103 // TODO: Circuit breaker — failure_threshold, recovery_timeout, half_open_max_requests
104 };
105
106 using progress_callback_t = function<void(size_t, size_t)>;
107 using error_callback_t = function<void(const exception&)>;
109
111
112private:
113 client_type client_;
114 io_context* ctx_{nullptr};
115 config config_;
117 unordered_map<string, string> persistent_headers_;
118 mutable mutex mutex_;
119
120 progress_callback_t progress_callback_;
121 error_callback_t error_callback_;
122
123private:
124 string build_request_str(const http_client_request& req, const url& req_url) const;
125 bool send_request(string_view request_str, time_point& send_start);
126
127 optional<http_client_response> read_response(time_point& receive_start, const string& request_host,
128 const string& request_path);
129
130 void update_cookies(const vector<http_cookie>& resp_cookies, const url& request_url);
131 string build_cookie_header(const url& request_url) const;
132
133 http_client_response do_request(http_client_request request, int redirect_count = 0);
134 bool ensure_connected(const string& host, ports port, bool use_ssl = false);
135
136public:
137 explicit http_client(io_context& ioc) :
138 http_client(ioc, config()) {}
139
145 explicit http_client(io_context& ioc, config cfg);
146
147 explicit http_client(io_context& ioc, ssl_context ctx) :
148 http_client(ioc, move(ctx), config()) {}
149
156 explicit http_client(io_context& ioc, ssl_context ctx, config cfg);
157
158 ~http_client() = default;
159
160 http_client(const http_client&) = delete;
161 http_client& operator=(const http_client&) = delete;
162
163 http_client(http_client&&) noexcept = delete;
164 http_client& operator=(http_client&&) noexcept = delete;
165
166 // TODO: Declarative HTTP client — interface-based client generation (like @FeignClient / HttpExchange), define API as abstract methods with annotations
167
172 void set_config(config cfg) {
173 lock<mutex> lk(mutex_);
174 config_ = move(cfg);
175 }
176
181 const config& get_config() const noexcept { return config_; }
182
187 const client_type& get_client() const noexcept { return client_; }
188 client_type& get_client() noexcept { return client_; }
189
195 void set_default_header(const string& key, string value) {
196 lock<mutex> lk(mutex_);
197 persistent_headers_[key] = move(value);
198 }
199
204 void remove_default_header(const string& key) {
205 lock<mutex> lk(mutex_);
206 persistent_headers_.erase(key);
207 }
208
213 void set_max_redirects(uint16_t max) { config_.max_redirects = max; }
214
219 void set_follow_redirects(bool follow) { config_.follow_redirects = follow; }
220
225 void set_timeout(milliseconds timeout) {
226 config_.connect_timeout = timeout;
227 config_.send_timeout = timeout;
228 config_.receive_timeout = timeout;
229 }
230
236 void set_proxy(string host, const ports port) {
237 config_.proxy_host = move(host);
238 config_.proxy_port = port;
239 }
240
244 void clear_proxy() {
245 config_.proxy_host.clear();
246 config_.proxy_port = ports::UNDEF;
247 }
248
253 void set_progress_callback(progress_callback_t callback) { progress_callback_ = move(callback); }
254
259 void set_error_callback(error_callback_t callback) { error_callback_ = move(callback); }
260
266
271 void set_verify_ssl(bool verify);
272
277 lock<mutex> lk(mutex_);
278 cookie_jar_.clear();
279 }
280
287 void set_cookie(const http_cookie& c, const string& domain, const string& path = "/");
288
294 lock<mutex> lk(mutex_);
295 return cookie_jar_;
296 }
297
308 http_client_response get(const string& url, const unordered_map<string, string>& headers = {});
309
323 http_client_response post(const string& url, const string& body = "",
324 const string& content_type = "application/x-www-form-urlencoded",
325 const unordered_map<string, string>& headers = {});
326
338 http_client_response post_json(const string& url_str, const string& json_body,
339 const unordered_map<string, string>& headers);
340
352 http_client_response post_form(const string& url_str, const unordered_map<string, string>& form_data,
353 const unordered_map<string, string>& headers);
354
367 http_client_response put(const string& url, const string& body = "",
368 const string& content_type = "application/x-www-form-urlencoded",
369 const unordered_map<string, string>& headers = {});
370
380 http_client_response del(const string& url, const unordered_map<string, string>& headers = {});
381
392 http_client_response head(const string& url, const unordered_map<string, string>& headers = {});
393
405
418 http_client_response patch(const string& url, const string& body = "",
419 const string& content_type = "application/x-www-form-urlencoded",
420 const unordered_map<string, string>& headers = {});
421
428
436 bool download_file(const string& url, path output, bool is_binary = true);
437
444
448 void close();
449
454 NEFORCE_NODISCARD bool is_connected() const noexcept { return client_.is_connected(); }
455};
456 // HTTP
458
459NEFORCE_END_HTTP__
460NEFORCE_END_NAMESPACE__
461#endif // NEFORCE_NETWORK_HTTP_HTTP_CLIENT_HPP__
字节大小表示和转换工具
函数包装器主模板声明
独占future类模板
const client_type & get_client() const noexcept
获取底层客户端
bool download_file(const string &url, path output, bool is_binary=true)
下载文件
void set_config(config cfg)
设置客户端配置
http_client_response head(const string &url, const unordered_map< string, string > &headers={})
发送HEAD请求
future< http_client_response > request_async(http_client_request req)
异步HTTP请求
steady_clock::time_point time_point
时间点类型
http_client(io_context &ioc, ssl_context ctx, config cfg)
构造函数(带SSL上下文)
void set_default_header(const string &key, string value)
设置默认请求头
http_client_response put(const string &url, const string &body="", const string &content_type="application/x-www-form-urlencoded", const unordered_map< string, string > &headers={})
发送PUT请求
http_client_response request(http_client_request req)
发送自定义HTTP请求
http_client_response get(const string &url, const unordered_map< string, string > &headers={})
发送GET请求
void close()
关闭连接
void set_proxy(string host, const ports port)
设置代理
void set_follow_redirects(bool follow)
设置是否跟随重定向
void set_verify_ssl(bool verify)
设置是否验证SSL证书
void set_progress_callback(progress_callback_t callback)
设置进度回调
http_client_response post_json(const string &url_str, const string &json_body, const unordered_map< string, string > &headers)
发送POST JSON请求
void set_ssl_context(ssl_context ctx)
设置SSL上下文
void set_error_callback(error_callback_t callback)
设置错误回调
http_client_response post_form(const string &url_str, const unordered_map< string, string > &form_data, const unordered_map< string, string > &headers)
发送POST表单请求
function< void(const exception &)> error_callback_t
错误回调类型
void remove_default_header(const string &key)
移除默认请求头
void set_cookie(const http_cookie &c, const string &domain, const string &path="/")
设置Cookie
http_client_response patch(const string &url, const string &body="", const string &content_type="application/x-www-form-urlencoded", const unordered_map< string, string > &headers={})
发送PATCH请求
http_client_response del(const string &url, const unordered_map< string, string > &headers={})
发送DELETE请求
http_client(io_context &ioc, config cfg)
构造函数
const config & get_config() const noexcept
获取客户端配置
void clear_cookies()
清空Cookie存储
http_client_response options(const string &url, const unordered_map< string, string > &headers={})
发送OPTIONS请求
void set_timeout(milliseconds timeout)
设置统一超时时间
bool is_connected() const noexcept
检查是否已连接
void set_max_redirects(uint16_t max)
设置最大重定向次数
unordered_map< string, http_cookie > get_cookies() const
获取所有Cookie
function< void(size_t, size_t)> progress_callback_t
进度回调类型
http_client_response post(const string &url, const string &body="", const string &content_type="application/x-www-form-urlencoded", const unordered_map< string, string > &headers={})
发送POST请求
void clear_proxy()
清除代理设置
ssl_client client_type
底层客户端类型
统一异步操作核心
锁管理器模板
非递归互斥锁
文件路径类
SSL/TLS客户端类
SSL/TLS上下文管理类
动态大小数组容器
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
unsigned short uint16_t
16位无符号整数类型
duration< int64_t, milli > milliseconds
毫秒持续时间
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
HTTP客户端消息结构
互斥锁
文件路径类
milliseconds connect_timeout
连接超时
bool follow_redirects
是否跟随重定向
byte_size max_response_size
最大响应大小
milliseconds send_timeout
发送超时
bool verify_ssl
是否验证SSL证书
uint16_t max_redirects
最大重定向次数
milliseconds receive_timeout
接收超时
unordered_map< string, string > default_headers
默认请求头
网络端口封装类
@ UNDEF
未定义/无效端口
_NEFORCE time_point< steady_clock > time_point
时间点类型
时间点类模板
URL统一资源定位符
TCP客户端实现
URL统一资源定位符解析与构建