185 auto connect(
const std::string& host,
unsigned short port = 443) ->
VoidResult;
199 auto is_connected() const ->
bool;
207 auto get(const std::
string& path,
218 auto post(
const std::string& path,
219 const std::string& body,
220 const std::vector<http_header>& headers = {})
230 auto post(
const std::string& path,
231 const std::vector<uint8_t>& body,
232 const std::vector<http_header>& headers = {})
242 auto put(
const std::string& path,
243 const std::string& body,
244 const std::vector<http_header>& headers = {})
245 -> Result<http2_response>;
253 auto del(
const std::string& path,
254 const std::vector<http_header>& headers = {})
255 -> Result<http2_response>;
261 auto set_timeout(std::chrono::milliseconds timeout) -> void;
267 auto get_timeout() const -> std::chrono::milliseconds;
280 auto start_stream(const std::
string& path,
281 const std::vector<http_header>& headers,
282 std::function<
void(std::vector<uint8_t>)> on_data,
283 std::function<
void(std::vector<http_header>)> on_headers,
284 std::function<
void(
int)> on_complete)
294 auto write_stream(uint32_t stream_id,
295 const std::vector<uint8_t>& data,
296 bool end_stream = false) -> VoidResult;
303 auto close_stream_writer(uint32_t stream_id) -> VoidResult;
310 auto cancel_stream(uint32_t stream_id) -> VoidResult;
316 auto get_settings() const -> http2_settings;
322 auto set_settings(const http2_settings& settings) ->
void;
326 auto send_connection_preface() -> VoidResult;
327 auto send_settings() -> VoidResult;
328 auto handle_settings_frame(const settings_frame& frame) -> VoidResult;
329 auto send_settings_ack() -> VoidResult;
332 auto send_frame(const frame& f) -> VoidResult;
333 auto read_frame() -> Result<std::unique_ptr<frame>>;
334 auto process_frame(std::unique_ptr<frame> f) -> VoidResult;
337 auto allocate_stream_id() -> uint32_t;
338 auto get_stream(uint32_t stream_id) -> http2_stream*;
339 auto create_stream() -> http2_stream&;
340 auto close_stream(uint32_t stream_id) ->
void;
343 auto send_request(const std::
string& method,
344 const std::
string& path,
345 const std::vector<http_header>& headers,
346 const std::vector<uint8_t>& body)
347 -> Result<http2_response>;
348 auto build_headers(const std::
string& method,
349 const std::
string& path,
350 const std::vector<http_header>& additional) -> std::vector<http_header>;
353 auto handle_headers_frame(const headers_frame& f) -> VoidResult;
354 auto handle_data_frame(const data_frame& f) -> VoidResult;
355 auto handle_rst_stream_frame(const rst_stream_frame& f) -> VoidResult;
356 auto handle_goaway_frame(const goaway_frame& f) -> VoidResult;
357 auto handle_window_update_frame(const window_update_frame& f) -> VoidResult;
358 auto handle_ping_frame(const ping_frame& f) -> VoidResult;
361 auto run_io() ->
void;
362 auto stop_io() ->
void;
365 std::
string client_id_;
367 unsigned short port_ = 443;
370 std::unique_ptr<asio::io_context> io_context_;
371 std::unique_ptr<asio::ssl::context> ssl_context_;
372 std::unique_ptr<asio::ssl::stream<asio::ip::tcp::socket>> socket_;
373 std::unique_ptr<asio::executor_work_guard<asio::io_context::executor_type>> work_guard_;
374 std::future<
void> io_future_;
377 std::atomic<
bool> is_connected_{
false};
378 std::atomic<bool> is_running_{
false};
379 std::atomic<bool> goaway_received_{
false};
384 std::atomic<uint32_t> next_stream_id_{1};
385 int32_t connection_window_size_ = 65535;
396 std::chrono::milliseconds timeout_{30000};
402 static constexpr std::string_view CONNECTION_PREFACE =
403 "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n";
404 static constexpr size_t FRAME_HEADER_SIZE = 9;
405 static constexpr size_t DEFAULT_WINDOW_SIZE = 65535;