1#include <test/jtx/JSONRPCClient.h>
3#include <test/jtx/AbstractClient.h>
5#include <xrpld/core/Config.h>
7#include <xrpl/basics/contract.h>
8#include <xrpl/config/BasicConfig.h>
9#include <xrpl/config/Constants.h>
10#include <xrpl/json/json_reader.h>
11#include <xrpl/json/json_value.h>
12#include <xrpl/json/to_string.h>
13#include <xrpl/protocol/jss.h>
14#include <xrpl/server/Port.h>
16#include <boost/asio/buffer.hpp>
17#include <boost/asio/error.hpp>
18#include <boost/asio/io_context.hpp>
19#include <boost/asio/ip/address_v4.hpp>
20#include <boost/asio/ip/address_v6.hpp>
21#include <boost/asio/ip/tcp.hpp>
22#include <boost/beast/core/multi_buffer.hpp>
23#include <boost/beast/http/dynamic_body.hpp>
24#include <boost/beast/http/error.hpp>
25#include <boost/beast/http/message.hpp>
26#include <boost/beast/http/read.hpp>
27#include <boost/beast/http/string_body.hpp>
28#include <boost/beast/http/verb.hpp>
29#include <boost/beast/http/write.hpp>
30#include <boost/system/system_error.hpp>
44 static boost::asio::ip::tcp::endpoint
58 using namespace boost::asio::ip;
59 if (pp.
ip && pp.
ip->is_unspecified())
61 *pp.
ip = pp.
ip->is_v6() ? address{address_v6::loopback()}
62 : address{address_v4::loopback()};
74 template <
class ConstBufferSequence>
81 buffer_copy(buffer(&s[0], s.
size()), b);
85 boost::asio::ip::tcp::endpoint
ep_;
86 boost::asio::io_context
ios_;
88 boost::beast::multi_buffer
bin_;
89 boost::beast::multi_buffer
bout_;
100 namespace error = boost::asio::error;
101 static auto const kDroppedConnectionErrors = std::to_array<boost::system::error_code>({
102 boost::beast::http::error::end_of_stream,
104 error::connection_reset,
105 error::connection_aborted,
107 error::not_connected,
111 kDroppedConnectionErrors,
112 [&ec](boost::system::error_code
const& e) {
return ec == e; });
120 boost::system::error_code ec;
140 using namespace boost::beast::http;
142 using namespace std::string_literals;
151 request<string_body> req;
152 req.method(boost::beast::http::verb::post);
155 req.insert(
"Content-Type",
"application/json; charset=UTF-8");
159 req.insert(
"Host", ostr.
str());
163 jr[jss::method] = cmd;
166 jr[jss::jsonrpc] =
"2.0";
167 jr[jss::ripplerpc] =
"2.0";
177 req.prepare_payload();
184 response<dynamic_body> res;
185 auto writeAndRead = [&] {
193 catch (boost::system::system_error
const& e)
205 if (jv[
"result"].isMember(
"error"))
206 jv[
"error"] = jv[
"result"][
"error"];
207 if (jv[
"result"].isMember(
"status"))
208 jv[
"status"] = jv[
"result"][
"status"];
212 [[nodiscard]]
unsigned
226 boost::system::error_code ec;
227 stream_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
Unserialize a JSON document into a Value.
bool parse(std::string const &document, Value &root)
Read a Value from a JSON document.
Value & append(Value const &value)
Append value to array at the end.
Holds unparsed configuration information.
bool exists(std::string const &name) const
Returns true if a section with the given name exists.
Section & section(std::string const &name)
Returns the section with the given name.
std::vector< std::string > const & values() const
Returns all the values in the section.
JSONRPCClient(Config const &cfg, unsigned rpcVersion)
static std::string bufferString(ConstBufferSequence const &b)
unsigned version() const override
Get RPC 1.0 or RPC 2.0.
static bool droppedConnection(boost::system::error_code const &ec)
boost::asio::ip::tcp::endpoint ep_
boost::asio::ip::tcp::socket stream_
boost::beast::multi_buffer bout_
boost::beast::multi_buffer bin_
boost::asio::io_context ios_
static boost::asio::ip::tcp::endpoint getEndpoint(BasicConfig const &cfg)
void disconnect() override
Close the client's connection to the server.
json::Value invoke(std::string const &cmd, json::Value const ¶ms) override
Submit a command synchronously.
@ Array
array value (ordered list)
std::unique_ptr< AbstractClient > makeJSONRPCClient(Config const &cfg, unsigned rpcVersion)
Returns a client using JSON-RPC over HTTP/S.
void parsePort(ParsedPort &port, Section const §ion, std::ostream &log)
std::string to_string(BaseUInt< Bits, Tag > const &a)
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
std::set< std::string, boost::beast::iless > protocol
std::optional< boost::asio::ip::address > ip
std::optional< std::uint16_t > port
static constexpr auto kServer