Files
ligo/include/ligo/http.hpp
T
khodowany 4170d3a003
publish / publish (push) Successful in 27m34s
Formatting
2026-09-14 23:54:56 -05:00

87 lines
2.7 KiB
C++
Executable File

#pragma once
#include <expected>
#include <chrono>
#include <cstdint>
#include <functional>
#include <string>
#include <boost/asio/any_io_executor.hpp>
#include <boost/asio/awaitable.hpp>
#include <boost/asio/io_context.hpp>
#include <boost/json/value.hpp>
#include <modulus.hpp>
#include <ligo/detail/state.hpp>
#include <ligo/config.hpp>
#include <ligo/security.hpp>
#include <ligo/service.hpp>
namespace ligo::http {
enum class method {
GET,
POST,
PUT,
PATCH,
DELETE,
};
struct endpoint {
std::string host{"127.0.0.1"};
std::uint16_t port{0};
};
struct request {
ligo::http::method method{ligo::http::method::POST};
std::string target{"/"};
boost::json::value payload{};
};
struct client_options {
std::chrono::milliseconds timeout{5000};
std::uint64_t max_body_size{16U * 1024U * 1024U};
ligo::security_config security{};
};
struct server_options {
std::chrono::milliseconds timeout{5000};
std::uint64_t max_body_size{16U * 1024U * 1024U};
std::function<void(modulus::error)> on_error{};
ligo::security_config security{};
};
class client {
public:
explicit client(ligo::http::endpoint endpoint, ligo::http::client_options options = {});
auto call(ligo::http::request const &request) const -> boost::asio::awaitable<std::expected<boost::json::value, modulus::error>>;
private:
ligo::http::endpoint endpoint_{};
ligo::http::client_options options_{};
};
class server {
public:
server(boost::asio::io_context &io, ligo::http::endpoint endpoint, ligo::service_router router, ligo::http::server_options options = {});
server(boost::asio::any_io_executor executor, ligo::http::endpoint endpoint, ligo::service_router router, ligo::http::server_options options = {});
server(ligo::http::server const &) = delete;
server(ligo::http::server &&) noexcept = default;
~server();
auto operator=(ligo::http::server const &) -> ligo::http::server & = delete;
auto operator=(ligo::http::server &&) noexcept -> ligo::http::server &;
auto start() -> std::expected<void, modulus::error>;
auto stop() -> void;
auto async_stop(std::chrono::milliseconds timeout = std::chrono::milliseconds{5000}) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
auto selected_port() const -> std::uint16_t;
private:
ligo::detail::state_handle state_{};
};
auto client_endpoint_from_config(ligo::endpoint_config const &config) -> std::expected<ligo::http::endpoint, modulus::error>;
auto server_endpoint_from_config(ligo::endpoint_config const &config) -> std::expected<ligo::http::endpoint, modulus::error>;
auto client_options_from_config(ligo::endpoint_config const &config) -> ligo::http::client_options;
auto server_options_from_config(ligo::endpoint_config const &config) -> ligo::http::server_options;
}