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 bool m_ssl_verify = true; // verify TLS certificates and hostnames
117 boost::optional<std::string> m_zmq_uri; // TODO: implement zmq listener
118 boost::optional<uint32_t> m_timeout_ms; // RPC request timeout in milliseconds
119 boost::optional<uint64_t> m_response_time; // automatically set by calling check_connection()
120 int m_priority; // priority relative to other connections where 1 is highest, then 2, etc, and 0 is lowest (default)
121
122 static void from_property_tree(const boost::property_tree::ptree& node, const std::shared_ptr<monero_rpc_connection>& connection);
123 static std::shared_ptr<monero_rpc_connection> deserialize(const std::string& json);
124
131 static bool compare(int p1, int p2);
132
144 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);
145
152
158 bool is_onion() const;
159
165 bool is_i2p() const;
166
173 void set_credentials(const std::string& username, const std::string& password);
174
181 void set_attribute(const std::string& key, const std::string& val);
182
189 std::string get_attribute(const std::string& key) const;
190
196 boost::optional<bool> is_online() const;
197
203 boost::optional<bool> is_authenticated() const;
204
210 boost::optional<bool> is_connected() const;
211
218 bool check_connection(const boost::optional<uint32_t>& timeout_ms = boost::none);
219
227 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;
228
236 monero_rpc_response send_json_request(const monero_rpc_request &request, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
237
247 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;
248
256 monero_rpc_response send_path_request(const monero_rpc_request &request, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
257
265 monero_rpc_response send_binary_request(const monero_rpc_request &request, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
266
267 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator) const override;
268
269 protected:
270 // instance variables
271 mutable boost::recursive_mutex m_mutex;
272 boost::optional<bool> m_is_online;
273 boost::optional<bool> m_is_authenticated;
274 mutable std::unique_ptr<epee::net_utils::http::abstract_http_client> m_http_client;
275 std::unordered_map<std::string, std::string> m_attributes;
276 mutable std::tuple<std::string, std::string, std::string, std::string, bool> m_applied{"", "", "", "", true};
277
278 void ensure_configured() const;
279 std::string invoke_post(const boost::string_ref uri, const std::string& body, const boost::optional<uint32_t>& timeout_ms = boost::none) const;
280 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;
281 };
282
283}
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:266
void set_credentials(const std::string &username, const std::string &password)
Definition monero_rpc_connection.cpp:154
bool is_onion() const
Definition monero_rpc_connection.cpp:140
boost::optional< bool > is_authenticated() const
Definition monero_rpc_connection.cpp:212
bool is_i2p() const
Definition monero_rpc_connection.cpp:147
std::string get_attribute(const std::string &key) const
Definition monero_rpc_connection.cpp:198
void set_attribute(const std::string &key, const std::string &val)
Definition monero_rpc_connection.cpp:193
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:287
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:217
bool check_connection(const boost::optional< uint32_t > &timeout_ms=boost::none)
Definition monero_rpc_connection.cpp:223
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:311
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:112
boost::optional< bool > is_online() const
Definition monero_rpc_connection.cpp:207
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