#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct WebHeader { WebHeader(boost::beast::http::field name, std::string value); WebHeader(std::string_view name, std::string value); std::variant name; std::string value; }; struct HttpSyncClient { static std::pair post( std::string const& host, std::string const& port, std::string const& body, std::vector additionalHeaders = {} ); static std::pair get(std::string const& host, std::string const& port, std::string const& body, std::string const& target, std::vector additionalHeaders = {}); }; struct HttpsSyncClient { static bool verifyCertificate(bool /* preverified */, boost::asio::ssl::verify_context& /* ctx */); static std::string syncPost(std::string const& host, std::string const& port, std::string const& body); }; class HttpAsyncClient { boost::beast::tcp_stream stream_; boost::beast::flat_buffer buffer_; public: HttpAsyncClient(boost::asio::io_context& ioContext); std::expected connect( std::string_view host, std::string_view port, boost::asio::yield_context yield, std::chrono::steady_clock::duration timeout ); std::expected send( boost::beast::http::request request, boost::asio::yield_context yield, std::chrono::steady_clock::duration timeout ); std::expected< boost::beast::http::response, boost::system::error_code> receive(boost::asio::yield_context yield, std::chrono::steady_clock::duration timeout); void gracefulShutdown(); void disconnect(); };