211 auto connect(
const std::string& host,
unsigned short port = 443) ->
VoidResult;
225 auto is_connected() const ->
bool;
233 auto get(const std::
string& path,
244 auto post(
const std::string& path,
245 const std::string& body,
246 const std::vector<http_header>& headers = {})
256 auto post(
const std::string& path,
257 const std::vector<uint8_t>& body,
258 const std::vector<http_header>& headers = {})
268 auto put(
const std::string& path,
269 const std::string& body,
270 const std::vector<http_header>& headers = {})
271 -> Result<http2_response>;
279 auto del(
const std::string& path,
280 const std::vector<http_header>& headers = {})
281 -> Result<http2_response>;
287 auto set_timeout(std::chrono::milliseconds timeout) -> void;
293 auto get_timeout() const -> std::chrono::milliseconds;
306 auto start_stream(const std::
string& path,
307 const std::vector<http_header>& headers,
308 std::function<
void(std::vector<uint8_t>)> on_data,
309 std::function<
void(std::vector<http_header>)> on_headers,
310 std::function<
void(
int)> on_complete)
320 auto write_stream(uint32_t stream_id,
321 const std::vector<uint8_t>& data,
322 bool end_stream = false) -> VoidResult;
329 auto close_stream_writer(uint32_t stream_id) -> VoidResult;
336 auto cancel_stream(uint32_t stream_id) -> VoidResult;
342 auto get_settings() const -> http2_settings;
348 auto set_settings(const http2_settings& settings) ->
void;
352 auto send_connection_preface() -> VoidResult;
353 auto send_settings() -> VoidResult;
354 auto handle_settings_frame(const settings_frame& frame) -> VoidResult;
355 auto send_settings_ack() -> VoidResult;
358 auto send_frame(const frame& f) -> VoidResult;
359 auto read_next_frame() ->
void;
360 auto write_next_frame() ->
void;
361 auto process_frame(std::unique_ptr<frame> f) -> VoidResult;
364 auto allocate_stream_id() -> uint32_t;
365 auto get_stream(uint32_t stream_id) -> http2_stream*;
366 auto create_stream() -> http2_stream&;
367 auto close_stream(uint32_t stream_id) ->
void;
370 auto send_request(const std::
string& method,
371 const std::
string& path,
372 const std::vector<http_header>& headers,
373 const std::vector<uint8_t>& body)
374 -> Result<http2_response>;
375 auto build_headers(const std::
string& method,
376 const std::
string& path,
377 const std::vector<http_header>& additional) -> std::vector<http_header>;
380 auto handle_headers_frame(const headers_frame& f) -> VoidResult;
381 auto handle_data_frame(const data_frame& f) -> VoidResult;
382 auto handle_rst_stream_frame(const rst_stream_frame& f) -> VoidResult;
383 auto handle_goaway_frame(const goaway_frame& f) -> VoidResult;
384 auto handle_window_update_frame(const window_update_frame& f) -> VoidResult;
385 auto handle_ping_frame(const ping_frame& f) -> VoidResult;
388 auto run_io() ->
void;
389 auto stop_io() ->
void;
392 std::
string client_id_;
394 unsigned short port_ = 443;
399 std::unique_ptr<asio::io_context> io_context_;
400 std::unique_ptr<asio::ssl::context> ssl_context_;
401 std::unique_ptr<asio::ssl::stream<asio::ip::tcp::socket>> socket_;
402 std::unique_ptr<asio::executor_work_guard<asio::io_context::executor_type>> work_guard_;
403 std::future<
void> io_future_;
408 bool io_active_ = false;
417 std::atomic<bool> is_connected_{
false};
418 std::atomic<bool> is_running_{
false};
419 std::atomic<bool> goaway_received_{
false};
424 std::atomic<uint32_t> next_stream_id_{1};
425 int32_t connection_window_size_ = 65535;
436 std::atomic<std::chrono::milliseconds> timeout_{std::chrono::milliseconds(30000)};
442 static constexpr std::string_view CONNECTION_PREFACE =
443 "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n";
444 static constexpr size_t FRAME_HEADER_SIZE = 9;
445 static constexpr size_t DEFAULT_WINDOW_SIZE = 65535;
447#if defined(NETWORK_ENABLE_TEST_INJECTION)
454 friend class kcenon::network::tests::support::http2_client_test_access;