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"
8class MSTL_API http_server {
10 using handle_sock_t = tcp_server::handle_sock_t;
15 _INNER session_manager session_manager_;
16 HTTP_COOKIE_NAME cookie_name_{HTTP_COOKIE_NAME::JSESSIONID};
19 void handle_client(handle_sock_t client_socket);
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);
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);
30 void add_session_cookie(
const http_request& request, http_response& response,
_MSTL session* session)
const;
33 explicit http_server(
uint16_t port,
int backlog = 128);
34 ~http_server() =
default;
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);
42 MSTL_NODISCARD http_router& router() noexcept {
return router_; }
43 MSTL_NODISCARD
const http_router& router() const noexcept {
return router_; }
45 MSTL_NODISCARD
_MSTL session* session(http_request& request,
bool create =
false);
47 void set_cookie_name(HTTP_COOKIE_NAME name)
noexcept {
50 MSTL_NODISCARD
const HTTP_COOKIE_NAME& cookie_name() const noexcept {
54 MSTL_NODISCARD
uint16_t port() const noexcept {
return server_.port(); }
55 MSTL_NODISCARD
bool is_running() const noexcept {
return server_.is_running(); }
57 bool start(SOCKET_DOMAIN domain = SOCKET_DOMAIN::IPV4,
58 SOCKET_TYPE type = SOCKET_TYPE::STREAM,
59 SOCKET_PROTOCOL protocol = SOCKET_PROTOCOL::AUTO,
61 return server_.start(domain, type, protocol, thread_count);
64 void stop() noexcept { server_.stop(); }
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()))
获取容器的底层数据指针