// GNU Lesser General Public License v3.0 // Copyright (c) 2025 Bart Beumer // // 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 #include #include #include #include #include #include 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> parser; session_state m_state; std::queue<> m_outstanding_requests; }; class internal_server final : public std::enable_shared_from_this { 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 session, boost::beast::error_code ec, std::size_t size); void session_finalize_response(std::shared_ptr session); void session_remove(std::shared_ptr 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> m_sessions; }; } // namespace detail } // namespace bmrshared::web