87 lines
2.7 KiB
C++
Executable File
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;
|
|
|
|
}
|