Monero C++ Library
Loading...
Searching...
No Matches
monero_rpc_connection.h
1
52
53#pragma once
54
55#include <boost/thread/mutex.hpp>
56#include <boost/thread/thread.hpp>
57#include <boost/thread/condition_variable.hpp>
58#include <boost/property_tree/ptree.hpp>
59#include <boost/property_tree/json_parser.hpp>
60#include "rapidjson/document.h"
61#include "rapidjson/writer.h"
62#include "rapidjson/stringbuffer.h"
63#include "net/http.h"
64#include "daemon/monero_daemon_model.h"
65
69namespace monero {
70
74 struct monero_request_params : public serializable_struct {
75 monero_request_params() { }
76
77 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator) const override;
78 };
79
83 struct monero_rpc_request : public serializable_struct {
84 boost::optional<std::string> m_id;
85 boost::optional<std::string> m_version;
86 boost::optional<std::string> m_method;
87 std::shared_ptr<serializable_struct> m_params;
88
89 monero_rpc_request() { }
90 monero_rpc_request(const std::string& method, const std::shared_ptr<serializable_struct>& params, bool json_rpc = true);
91
92 bool is_json_rpc() const { return m_id != boost::none && m_version != boost::none; }
93
94 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator) const override;
95 };
96
101 boost::optional<std::string> m_jsonrpc;
102 boost::optional<boost::property_tree::ptree> m_result;
103 boost::optional<boost::property_tree::ptree> m_response;
104 boost::optional<std::string> m_binary;
105 };
106
111 public:
112 boost::optional<std::string> m_uri;
113 boost::optional<std::string> m_username;
114 boost::optional<std::string> m_password;
115 boost::optional<std::string> m_proxy_uri;
116 boost::optional<std::string> m_zmq_uri; // TODO: implement zmq listener
117 boost::optional<uint32_t> m_timeout_ms; // RPC request timeout in milliseconds
118 boost::optional<uint64_t> m_response_time; // automatically set by calling check_connection()
119 int m_priority; // priority relative to other connections where 1 is highest, then 2, etc, and 0 is lowest (default)
120
121 static void from_property_tree(const boost::property_tree::ptree& node, const std::shared_ptr<monero_rpc_connection>& connection);
122 static std::shared_ptr<monero_rpc_connection> deserialize(const std::string& json);
123
130 static bool compare(int p1, int p2);
131
143 monero_rpc_connection(const std::string& uri = "", const std::string& username = "", const std::string& password = "", const std::string& proxy_uri = "", const std::string& zmq_uri = "", int priority = 0, const boost::optional<uint32_t>& timeout_ms = boost::none);
144
151
157 bool is_onion() const;
158
164 bool is_i2p() const;
165
172 void set_credentials(const std::string& username, const std::string& password);
173
180 void set_attribute(const std::string& key, const std::string& val);
181
188 std::string get_attribute(const std::string& key) const;
189
195 boost::optional<bool> is_online() const;
196
202 boost::optional<bool> is_authenticated() const;
203
209 boost::optional<bool> is_connected() const;
210
217 bool check_connection(const boost::optional<uint32_t>& timeout_ms = boost::none);
218
226 boost::property_tree::ptree send_json_request(const std::string& path, const std::shared_ptr<serializable_struct>& params = nullptr, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
227
235 monero_rpc_response send_json_request(const monero_rpc_request &request, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
236
246 boost::property_tree::ptree send_path_request(const std::string& path, const std::shared_ptr<serializable_struct>& params = nullptr, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
247
255 monero_rpc_response send_path_request(const monero_rpc_request &request, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
256
264 monero_rpc_response send_binary_request(const monero_rpc_request &request, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
265
266 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator) const override;
267
268 protected:
269 // instance variables
270 mutable boost::recursive_mutex m_mutex;
271 boost::optional<bool> m_is_online;
272 boost::optional<bool> m_is_authenticated;
273 mutable std::unique_ptr<epee::net_utils::http::abstract_http_client> m_http_client;
274 std::unordered_map<std::string, std::string> m_attributes;
275 mutable std::tuple<std::string, std::string, std::string, std::string> m_applied;
276
277 void ensure_configured() const;
278 std::string invoke_post(const boost::string_ref uri, const std::string& body, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
279 void send_rpc_request(const boost::string_ref uri, const monero_rpc_request& request, monero_rpc_response& response, const boost::optional<uint32_t>& timeout_ms = boost::none, bool binary = false) const;
280 };
281
282}
boost::property_tree::ptree send_json_request(const std::string &path, const std::shared_ptr< serializable_struct > &params=nullptr, const boost::optional< uint32_t > &timeout_ms=boost::none) const
Definition monero_rpc_connection.cpp:264
void set_credentials(const std::string &username, const std::string &password)
Definition monero_rpc_connection.cpp:152
bool is_onion() const
Definition monero_rpc_connection.cpp:138
boost::optional< bool > is_authenticated() const
Definition monero_rpc_connection.cpp:210
bool is_i2p() const
Definition monero_rpc_connection.cpp:145
std::string get_attribute(const std::string &key) const
Definition monero_rpc_connection.cpp:196
void set_attribute(const std::string &key, const std::string &val)
Definition monero_rpc_connection.cpp:191
boost::property_tree::ptree send_path_request(const std::string &path, const std::shared_ptr< serializable_struct > &params=nullptr, const boost::optional< uint32_t > &timeout_ms=boost::none) const
Definition monero_rpc_connection.cpp:285
monero_rpc_connection(const std::string &uri="", const std::string &username="", const std::string &password="", const std::string &proxy_uri="", const std::string &zmq_uri="", int priority=0, const boost::optional< uint32_t > &timeout_ms=boost::none)
Definition monero_rpc_connection.cpp:85
boost::optional< bool > is_connected() const
Definition monero_rpc_connection.cpp:215
bool check_connection(const boost::optional< uint32_t > &timeout_ms=boost::none)
Definition monero_rpc_connection.cpp:221
monero_rpc_response send_binary_request(const monero_rpc_request &request, const boost::optional< uint32_t > &timeout_ms=boost::none) const
Definition monero_rpc_connection.cpp:309
static bool compare(int p1, int p2)
Definition monero_rpc_connection.cpp:77
rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType &allocator) const override
Definition monero_rpc_connection.cpp:111
boost::optional< bool > is_online() const
Definition monero_rpc_connection.cpp:205
Definition monero_error.h:61
rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType &allocator) const override
Definition monero_rpc_connection.cpp:13
Definition monero_rpc_connection.h:83
rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType &allocator) const override
Definition monero_rpc_connection.cpp:28
Definition monero_rpc_connection.h:100
Definition monero_daemon_model.h:70