NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
http_server_message.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_HTTP_HTTP_SERVER_MESSAGE_HPP__
2#define NEFORCE_NETWORK_HTTP_HTTP_SERVER_MESSAGE_HPP__
3
21
22#include "NeForce/core/container/buffer_chain.hpp"
25NEFORCE_BEGIN_NAMESPACE__
26
32
33NEFORCE_BEGIN_HTTP__
34
39
80struct NEFORCE_API http_server_request : iobject<http_server_request> {
82 string path{"/"};
83 string version{"HTTP/1.1"};
84 string query;
85 string body;
86
92
93 http_session* session = nullptr;
95
101 NEFORCE_NODISCARD string_view parameter(const string& name) const {
102 const auto it = parameters.find(name);
103 return it != parameters.end() ? it->second.view() : "";
104 }
105
111 void set_parameter(const string& name, string value) { parameters[name] = move(value); }
112
118 NEFORCE_NODISCARD bool has_parameter(const string& name) const { return parameters.find(name) != parameters.end(); }
119
125 NEFORCE_NODISCARD string_view cookie(const string& name) const {
126 const auto it = cookies.find(name);
127 return it != cookies.end() ? it->second.view() : "";
128 }
129
135 void set_cookie(const string& name, string value) { cookies[name] = move(value); }
136
142 NEFORCE_NODISCARD bool has_cookie(const string& name) const { return cookies.find(name) != cookies.end(); }
143
149 NEFORCE_NODISCARD string_view header(const string& name) const {
150 const auto it = headers.find(name);
151 return it != headers.end() ? it->second.view() : "";
152 }
153
159 void set_header(const string& name, string value) { headers[name] = move(value); }
160
166 NEFORCE_NODISCARD bool has_header(const string& name) const { return headers.find(name) != headers.end(); }
167
172 NEFORCE_NODISCARD bool has_session() const noexcept { return session != nullptr && session->is_valid(); }
173
178 NEFORCE_NODISCARD string_view content_type() const { return header(http_key::Content_Type()); }
179
184 NEFORCE_NODISCARD bool is_keep_alive() const {
185 const auto conn = header(http_key::Connection());
186 const string conn_lower = string(conn).lowercase();
187 if (conn_lower == "close") {
188 return false;
189 }
190 // HTTP/1.1+ defaults to keep-alive; HTTP/1.0 requires explicit keep-alive
191 if (!version.starts_with("HTTP/1.0")) {
192 return true;
193 }
194 return conn_lower.starts_with("keep-alive");
195 }
196
204 NEFORCE_NODISCARD string_view client_ip() const;
205
210 NEFORCE_NODISCARD string_view user_agent() const { return header("User-Agent"); }
211
216 NEFORCE_NODISCARD string_view referer() const { return header("Referer"); }
217
224 NEFORCE_NODISCARD bool is_ajax() const { return header("X-Requested-With") == "XMLHttpRequest"; }
225
229 void clear();
230
240 NEFORCE_NODISCARD static http_server_request parse(string_view str);
241
246 NEFORCE_NODISCARD string to_string() const;
247};
248
249
284struct NEFORCE_API http_server_response : istringify<http_server_response> {
285 string version{"HTTP/1.1"};
290 string body;
294 bool chunked_encoding{false};
295
302 headers[http_key::Content_Type()] = http_content::PLAIN_TEXT().to_string() + "; charset=utf-8";
303 }
304
310 NEFORCE_NODISCARD string_view header(const string& name) const {
311 const auto it = headers.find(name);
312 return it != headers.end() ? it->second.view() : "";
313 }
314
320 void set_header(const string& name, string value) { headers[name] = move(value); }
321
327 NEFORCE_NODISCARD bool has_header(const string& name) const { return headers.find(name) != headers.end(); }
328
333 void set_content_type(http_content value) { headers[http_key::Content_Type()] = move(value).content(); }
334
339 void set_content_type(string value) { headers[http_key::Content_Type()] = move(value); }
340
348 NEFORCE_NODISCARD string to_string() const;
349
353 NEFORCE_NODISCARD string build_header_string() const;
354
355 // TODO: Problem Details (RFC 9457) — add set_problem_detail(type, title, detail, instance) for standardized error
356 // responses
357};
358
364
370 // HTTP
372
373NEFORCE_END_HTTP__
374NEFORCE_END_NAMESPACE__
375#endif // NEFORCE_NETWORK_HTTP_HTTP_SERVER_MESSAGE_HPP__
constexpr bool starts_with(const basic_string &other) const noexcept
检查是否以另一个字符串开头
constexpr basic_string & lowercase() noexcept(noexcept(_NEFORCE transform(begin(), end(), begin(), _NEFORCE to_lowercase< CharT >)))
转换为小写
动态大小数组容器
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)))
移动范围元素
basic_string< char > string
字符字符串
basic_string_view< char > string_view
字符字符串视图
http_status
HTTP状态码枚举
@ S4_NOT_FOUND
404 Not Found 请求的资源不存在
unordered_map< string, any > http_context
请求上下文,跨过滤器/中间件传递任意数据
HTTP Cookie和会话管理
static const http_content & PLAIN_TEXT()
text/plain
static const http_method & GET()
GET方法
string_view user_agent() const
获取User-Agent
string_view content_type() const
获取Content-Type
unordered_map< string, string > trailers
Trailer头部
bool has_header(const string &name) const
检查请求头是否存在
string_view cookie(const string &name) const
获取Cookie值
unordered_map< string, string > cookies
Cookie
void set_parameter(const string &name, string value)
设置参数
void set_cookie(const string &name, string value)
设置Cookie值
string_view client_ip() const
获取客户端真实IP
string_view referer() const
获取Referer
bool is_keep_alive() const
检查是否为Keep-Alive连接
unordered_map< string, string > parameters
请求参数
string to_string() const
序列化为HTTP请求字符串
string_view parameter(const string &name) const
获取参数值
bool has_parameter(const string &name) const
检查参数是否存在
unordered_map< string, string > form_data
表单数据
void set_header(const string &name, string value)
设置请求头
void clear()
清空请求所有数据
string_view header(const string &name) const
获取请求头值
bool has_session() const noexcept
检查是否有关联的有效会话
bool is_ajax() const
检查是否为AJAX请求
static http_server_request parse(string_view str)
从字符串解析HTTP请求
unordered_map< string, string > headers
请求头
bool has_cookie(const string &name) const
检查Cookie是否存在
unordered_map< string, string > headers
响应头
bool has_header(const string &name) const
检查响应头是否存在
void set_content_type(http_content value)
设置Content-Type
string build_header_string() const
构建响应头字符串
vector< http_cookie > cookies
设置的Cookie
string_view header(const string &name) const
获取响应头值
void set_header(const string &name, string value)
设置响应头
unordered_map< string, string > trailers
Trailer头部
string to_string() const
序列化为HTTP响应字符串
bool chunked_encoding
是否使用chunked传输编码
void set_content_type(string value)
设置Content-Type
可解析对象接口
可字符串化接口
任意类