MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
http_server.hpp
1#ifndef MSTL_NETWORK_HTTP_SERVER_HPP__
2#define MSTL_NETWORK_HTTP_SERVER_HPP__
3#include "../tcp_server.hpp"
4#include "../ssl_socket.hpp"
5#include "http_router.hpp"
7
8class MSTL_API http_server {
9private:
10 using handle_sock_t = tcp_server::handle_sock_t;
11
12 tcp_server server_;
13 http_router router_;
14
15 _INNER session_manager session_manager_;
16 HTTP_COOKIE_NAME cookie_name_{HTTP_COOKIE_NAME::JSESSIONID};
17
18private:
19 void handle_client(handle_sock_t client_socket);
20
21 static void parse_cookies(string_view cookie_header, http_request& request);
22 static void parse_parameters(http_request& request);
23 static void parse_url_encoded(string_view data, unordered_map<string, string>& params);
24 static string url_decode(string_view str);
25
26 http_request parse_request(const handle_sock_t& client_socket);
27 static string build_response_str(const http_response& response);
28 static void send_response(const handle_sock_t& client_socket, const http_response& response);
29
30 void add_session_cookie(const http_request& request, http_response& response, _MSTL session* session) const;
31
32public:
33 explicit http_server(uint16_t port, int backlog = 128);
34 ~http_server() = default;
35
36#ifdef MSTL_SUPPORT_OPENSSL__
37 bool load_certificate(const string& cert_file, const string& key_file) {
38 return server_.load_certificate(cert_file, key_file);
39 }
40#endif
41
42 MSTL_NODISCARD http_router& router() noexcept { return router_; }
43 MSTL_NODISCARD const http_router& router() const noexcept { return router_; }
44
45 MSTL_NODISCARD _MSTL session* session(http_request& request, bool create = false);
46
47 void set_cookie_name(HTTP_COOKIE_NAME name) noexcept {
48 cookie_name_ = _MSTL move(name);
49 }
50 MSTL_NODISCARD const HTTP_COOKIE_NAME& cookie_name() const noexcept {
51 return cookie_name_;
52 }
53
54 MSTL_NODISCARD uint16_t port() const noexcept { return server_.port(); }
55 MSTL_NODISCARD bool is_running() const noexcept { return server_.is_running(); }
56
57 bool start(SOCKET_DOMAIN domain = SOCKET_DOMAIN::IPV4,
58 SOCKET_TYPE type = SOCKET_TYPE::STREAM,
59 SOCKET_PROTOCOL protocol = SOCKET_PROTOCOL::AUTO,
60 uint16_t thread_count = 5) {
61 return server_.start(domain, type, protocol, thread_count);
62 }
63
64 void stop() noexcept { server_.stop(); }
65};
66
68#endif // MSTL_NETWORK_HTTP_SERVER_HPP__
unsigned short uint16_t
16位无符号整数类型
#define _MSTL
全局命名空间MSTL前缀
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针