monero/src/rpc/bootstrap_daemon.h
anonimal d099658522
bootstrap_daemon: resolve CID 203915 (UNCAUGHT_EXCEPT)
The issue is triggered by the captured `this` in RPC server, which
passes reference to throwable `core_rpc_server`:

`core_rpc_server.cpp:164: m_bootstrap_daemon.reset(new bootstrap_daemon([this]{ return get_random_public_node(); }));`

The solution is to simply remove noexcept from the remaining `bootstrap_daemon`
constructors because noexcept is false in this context.

>"An exception of type "boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::asio::invalid_service_owner>>" is thrown but the throw list "noexcept" doesn't allow it to be thrown. This will cause a call to unexpected() which usually calls terminate()."
2019-09-07 00:29:09 +00:00

68 lines
2.0 KiB
C++

#pragma once
#include <functional>
#include <vector>
#include <boost/optional/optional.hpp>
#include <boost/utility/string_ref.hpp>
#include "net/http_client.h"
#include "storages/http_abstract_invoke.h"
namespace cryptonote
{
class bootstrap_daemon
{
public:
bootstrap_daemon(std::function<boost::optional<std::string>()> get_next_public_node);
bootstrap_daemon(const std::string &address, const boost::optional<epee::net_utils::http::login> &credentials);
std::string address() const noexcept;
boost::optional<uint64_t> get_height();
bool handle_result(bool success);
template <class t_request, class t_response>
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 <class t_request, class t_response>
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 <class t_request, class t_response>
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<epee::net_utils::http::login> &credentials = boost::none);
bool switch_server_if_needed();
private:
epee::net_utils::http::http_simple_client m_http_client;
std::function<boost::optional<std::string>()> m_get_next_public_node;
};
}