#pragma once #include #include #include #include #include "net/http_client.h" #include "storages/http_abstract_invoke.h" namespace cryptonote { class bootstrap_daemon { public: bootstrap_daemon(std::function()> get_next_public_node) noexcept; bootstrap_daemon(const std::string &address, const boost::optional &credentials); std::string address() const noexcept; boost::optional get_height(); bool handle_result(bool success); template bool invoke_http_json(const boost::string_ref uri, const t_request &out_struct, t_response &result_struct) { if (!switch_server_if_needed()) { return false; } return handle_result(epee::net_utils::invoke_http_json(uri, out_struct, result_struct, m_http_client)); } template bool invoke_http_bin(const boost::string_ref uri, const t_request &out_struct, t_response &result_struct) { if (!switch_server_if_needed()) { return false; } return handle_result(epee::net_utils::invoke_http_bin(uri, out_struct, result_struct, m_http_client)); } template bool invoke_http_json_rpc(const boost::string_ref command_name, const t_request &out_struct, t_response &result_struct) { if (!switch_server_if_needed()) { return false; } return handle_result(epee::net_utils::invoke_http_json_rpc("/json_rpc", std::string(command_name.begin(), command_name.end()), out_struct, result_struct, m_http_client)); } private: bool set_server(const std::string &address, const boost::optional &credentials = boost::none); bool switch_server_if_needed(); private: epee::net_utils::http::http_simple_client m_http_client; std::function()> m_get_next_public_node; }; }