2023-09-13 14:20:40 +02:00
|
|
|
#pragma once
|
|
|
|
#include "sdk.h"
|
|
|
|
// boost.beast будет использовать std::string_view вместо boost::string_view
|
|
|
|
#define BOOST_BEAST_USE_STD_STRING_VIEW
|
|
|
|
|
2023-09-13 16:01:44 +02:00
|
|
|
#include <iostream>
|
|
|
|
#include <string_view>
|
|
|
|
|
2023-09-13 14:20:40 +02:00
|
|
|
#include <boost/asio/ip/tcp.hpp>
|
|
|
|
#include <boost/asio/strand.hpp>
|
|
|
|
#include <boost/beast/core.hpp>
|
|
|
|
#include <boost/beast/http.hpp>
|
|
|
|
|
|
|
|
namespace http_server {
|
|
|
|
|
|
|
|
namespace net = boost::asio;
|
|
|
|
using tcp = net::ip::tcp;
|
|
|
|
namespace beast = boost::beast;
|
|
|
|
namespace http = beast::http;
|
2023-09-13 16:01:44 +02:00
|
|
|
|
|
|
|
using namespace std::literals;
|
|
|
|
|
|
|
|
void ReportError(beast::error_code ec, std::string_view what);
|
|
|
|
|
2023-09-13 14:20:40 +02:00
|
|
|
class SessionBase {
|
2023-09-13 17:02:35 +02:00
|
|
|
protected:
|
|
|
|
using HttpRequest = http::request<http::string_body>;
|
|
|
|
|
|
|
|
~SessionBase() = default;
|
|
|
|
|
|
|
|
public:
|
|
|
|
SessionBase(const SessionBase&) = delete;
|
|
|
|
SessionBase& operator =(const SessionBase&) = delete;
|
|
|
|
|
2023-09-13 17:13:28 +02:00
|
|
|
void Run();
|
|
|
|
void Read();
|
|
|
|
|
|
|
|
virtual std::shared_ptr<SessionBase> GetSharedThis() = 0;
|
|
|
|
|
2023-09-13 17:02:35 +02:00
|
|
|
protected:
|
|
|
|
explicit SessionBase(tcp::socket&& socket);
|
|
|
|
|
2023-09-14 20:39:36 +02:00
|
|
|
template <typename Body, typename Fields>
|
|
|
|
void Write(http::response<Body, Fields>&& response) {
|
|
|
|
// Запись выполняется асинхронно, поэтому response перемещаем в область кучи
|
|
|
|
auto safe_response = std::make_shared<http::response<Body, Fields>>(std::move(response));
|
|
|
|
|
|
|
|
auto self = GetSharedThis();
|
|
|
|
http::async_write(stream_, *safe_response,
|
|
|
|
[safe_response, self](beast::error_code ec, std::size_t bytes_written) {
|
|
|
|
self->OnWrite(safe_response->need_eof(), ec, bytes_written);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2023-09-13 17:02:35 +02:00
|
|
|
private:
|
|
|
|
beast::tcp_stream stream_;
|
|
|
|
beast::flat_buffer buffer_;
|
|
|
|
HttpRequest request_;
|
2023-09-13 17:41:18 +02:00
|
|
|
|
|
|
|
void OnRead(beast::error_code ec, [[maybe_unused]] size_t bytes_read);
|
|
|
|
|
|
|
|
void Close();
|
|
|
|
|
|
|
|
virtual void HandleRequest(HttpRequest&& request) = 0;
|
2023-09-14 20:39:36 +02:00
|
|
|
|
|
|
|
void OnWrite(bool close, beast::error_code ec, [[maybe_unused]] std::size_t bytes_written);
|
2023-09-13 14:20:40 +02:00
|
|
|
};
|
|
|
|
} // namespace http_server
|