network-experiment/bmrshared-web/lib/internal_server.h

75 lines
2.6 KiB
C++

// GNU Lesser General Public License v3.0
// Copyright (c) 2025 Bart Beumer <bart@4beumer.nl>
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License v3.0 as published by
// the Free Software Foundation.
//
#pragma once
#include <bmrshared/response_promise.hpp>
#include <bmrshared/server.hpp>
#include <boost/asio/io_context.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <chrono>
#include <memory>
#include <queue>
namespace bmrshared::web {
namespace detail {
enum class session_state {
queue_reading,
reading
};
struct http_session {
explicit http_session(boost::asio::ip::tcp::socket s)
: stream(std::move(s))
{}
boost::beast::tcp_stream stream;
boost::beast::flat_buffer buffer;
boost::optional<boost::beast::http::request_parser<boost::beast::http::string_body>> parser;
session_state m_state;
std::queue<> m_outstanding_requests;
};
class internal_server final : public std::enable_shared_from_this<internal_server> {
public:
using address_type = bmrshared::web::server::address_type;
using request_type = bmrshared::web::server::request_type;
public:
internal_server(boost::asio::io_context& io_context,
const boost::asio::ip::tcp::endpoint& listen_endpoint,
std::chrono::seconds incoming_request_timeout,
uint64_t request_body_limit,
unsigned int max_simultaneous_requests,
request_handler_interface& handler);
~internal_server();
void run();
private:
void async_accept();
void do_accept(boost::system::error_code ec, boost::asio::ip::tcp::socket socket);
void session_process_queued();
void session_on_read(std::shared_ptr<http_session> session, boost::beast::error_code ec, std::size_t size);
void session_finalize_response(std::shared_ptr<http_session> session);
void session_remove(std::shared_ptr<http_session> session);
private:
boost::asio::io_context& m_io_context;
boost::asio::ip::tcp::endpoint m_endPoint;
std::chrono::seconds m_incoming_request_timeout;
unsigned int m_max_simultaneous_requests;
uint64_t m_request_body_limit;
boost::asio::ip::tcp::acceptor m_acceptor;
request_handler_interface& m_handler;
std::vector<std::shared_ptr<http_session>> m_sessions;
};
} // namespace detail
} // namespace bmrshared::web