Files
clio/tests/common/util/TestHttpServer.hpp
2026-03-24 15:25:32 +00:00

63 lines
1.7 KiB
C++

#pragma once
#include <boost/asio/io_context.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/beast/http/message.hpp>
#include <boost/beast/http/string_body.hpp>
#include <expected>
#include <functional>
#include <optional>
#include <string>
/**
* @brief Simple HTTP server for use in unit tests
*/
class TestHttpServer {
public:
using RequestHandler =
std::function<std::optional<boost::beast::http::response<boost::beast::http::string_body>>(
boost::beast::http::request<boost::beast::http::string_body>
)>;
/**
* @brief Construct a new TestHttpServer
*
* @param context boost::asio::io_context to use for networking
* @param host host to bind to
*/
TestHttpServer(boost::asio::io_context& context, std::string host);
/**
* @brief Accept a new connection
*
* @param yield boost::asio::yield_context to use for networking
* @return Either a socket with the new connection or an error code
*/
std::expected<boost::asio::ip::tcp::socket, boost::system::error_code>
accept(boost::asio::yield_context yield);
/**
* @brief Start the server
*
* @note This method schedules to process only one request
*
* @param handler RequestHandler to use for incoming request
* @param allowToFail if true, the server will not throw an exception if the request fails
*/
void
handleRequest(RequestHandler handler, bool allowToFail = false);
/**
* @brief Return the port HTTP server is connected to
*
* @return string port number
*/
std::string
port() const;
private:
boost::asio::ip::tcp::acceptor acceptor_;
};