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
|
|
|
|
|
|
|
|
#include <boost/asio/ip/tcp.hpp>
|
|
|
|
#include <boost/asio/strand.hpp>
|
|
|
|
#include <boost/beast/core.hpp>
|
|
|
|
#include <boost/beast/http.hpp>
|
|
|
|
|
2023-09-13 16:01:44 +02:00
|
|
|
#include "session.h"
|
|
|
|
|
2023-09-13 14:20:40 +02:00
|
|
|
namespace http_server
|
|
|
|
{
|
|
|
|
namespace net = boost::asio;
|
2023-09-13 16:01:44 +02:00
|
|
|
namespace sys = boost::system;
|
2023-09-13 14:20:40 +02:00
|
|
|
using tcp = net::ip::tcp;
|
|
|
|
namespace beast = boost::beast;
|
|
|
|
namespace http = beast::http;
|
|
|
|
|
|
|
|
template<typename RequestHandler>
|
|
|
|
class Listener : public std::enable_shared_from_this<Listener<RequestHandler>>
|
|
|
|
{
|
2023-09-13 15:20:33 +02:00
|
|
|
net::io_context& ioc_;
|
|
|
|
tcp::acceptor acceptor_;
|
|
|
|
RequestHandler request_handler_;
|
|
|
|
|
|
|
|
public:
|
|
|
|
template<class Handler>
|
|
|
|
Listener(net::io_context& ioc,
|
|
|
|
const tcp::endpoint& endpoint,
|
|
|
|
Handler&& request_handler)
|
|
|
|
: ioc_(ioc),
|
2023-09-13 16:01:44 +02:00
|
|
|
acceptor_(net::make_strand(ioc)),
|
|
|
|
request_handler_(std::forward<Handler>(request_handler))
|
|
|
|
{
|
|
|
|
acceptor_.open(endpoint.protocol());
|
|
|
|
acceptor_.set_option(net::socket_base::reuse_address(true));
|
|
|
|
acceptor_.bind(endpoint);
|
|
|
|
acceptor_.listen(net::socket_base::max_listen_connections);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Run()
|
|
|
|
{
|
|
|
|
DoAccept();
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
void DoAccept()
|
|
|
|
{
|
|
|
|
acceptor_.async_accept(net::make_strand(ioc_),
|
|
|
|
beast::bind_front_handler(&Listener::DoAccept,
|
|
|
|
this->shared_from_this()));
|
|
|
|
}
|
|
|
|
|
|
|
|
void OnAccept(sys::error_code ec, tcp::socket socket)
|
|
|
|
{
|
|
|
|
if (ec)
|
2023-09-13 15:20:33 +02:00
|
|
|
{
|
2023-09-13 16:01:44 +02:00
|
|
|
return ReportError(ec, "accept"sv);
|
2023-09-13 15:20:33 +02:00
|
|
|
}
|
2023-09-13 16:01:44 +02:00
|
|
|
|
|
|
|
AsyncRunSession(std::move(socket));
|
|
|
|
|
|
|
|
DoAccept();
|
|
|
|
}
|
|
|
|
|
|
|
|
void AsyncRunSession(tcp::socket&& socket)
|
|
|
|
{}
|
2023-09-13 14:20:40 +02:00
|
|
|
};
|
|
|
|
} // namespace http_server
|