77 lines
2.7 KiB
C++
77 lines
2.7 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_request
|
|
{
|
|
std::optional<response_promise::response_sender> m_response_sender;
|
|
};
|
|
|
|
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<std::shared_ptr<http_request>> 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
|