Files
ligo/include/ligo/http.hpp
T
khodowany bff6884c09
publish / publish (push) Failing after 10m17s
Tweak
2026-10-04 23:19:34 -05:00

99 lines
3.1 KiB
C++
Executable File

#pragma once
#include <expected>
#include <chrono>
#include <cstdint>
#include <functional>
#include <map>
#include <optional>
#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{};
std::map<std::string, std::string> headers{};
std::optional<std::string> raw_body{};
};
struct response {
std::uint16_t status{};
std::map<std::string, std::string> headers{};
std::string body{};
};
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{};
bool parse_query{false};
};
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>>;
auto exchange(ligo::http::request const &request) const -> boost::asio::awaitable<std::expected<ligo::http::response, 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;
}