xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
xrpld
app
misc
detail
WorkBase.h
1
#pragma once
2
3
#include <xrpld/app/misc/detail/Work.h>
4
5
#include <xrpl/beast/utility/instrumentation.h>
6
#include <xrpl/protocol/BuildInfo.h>
7
8
#include <boost/asio.hpp>
9
#include <boost/asio/strand.hpp>
10
#include <boost/beast/core/multi_buffer.hpp>
11
#include <boost/beast/http/empty_body.hpp>
12
#include <boost/beast/http/read.hpp>
13
#include <boost/beast/http/write.hpp>
14
15
#include <
cstddef
>
16
#include <
functional
>
17
#include <
string
>
18
#include <
utility
>
19
20
namespace
xrpl::detail
{
21
22
template
<
class
Impl>
23
class
WorkBase
:
public
Work
24
{
25
protected
:
26
using
ErrorCode
= boost::system::error_code;
27
using
EndpointType
= boost::asio::ip::tcp::endpoint;
28
29
public
:
30
using
CallbackType
=
std::function
<void(
ErrorCode
const
&,
EndpointType
const
&,
ResponseType
&&)>;
31
32
protected
:
33
using
SocketType
= boost::asio::ip::tcp::socket;
34
using
ResolverType
= boost::asio::ip::tcp::resolver;
35
using
ResultsType
= boost::asio::ip::tcp::resolver::results_type;
36
using
RequestType
= boost::beast::http::request<boost::beast::http::empty_body>;
37
38
std::string
host_
;
39
std::string
path_
;
40
std::string
port_
;
41
CallbackType
cb_
;
42
boost::asio::io_context&
ios_
;
43
boost::asio::strand<boost::asio::io_context::executor_type>
strand_
;
44
ResolverType
resolver_
;
45
SocketType
socket_
;
46
RequestType
req_
;
47
ResponseType
res_
;
48
boost::beast::multi_buffer
readBuf_
;
49
EndpointType
lastEndpoint_
;
50
bool
lastStatus_
;
51
52
private
:
53
WorkBase
(
54
std::string
host,
55
std::string
path
,
56
std::string
port,
57
boost::asio::io_context& ios,
58
EndpointType
lastEndpoint,
59
bool
lastStatus,
60
CallbackType
cb);
61
62
public
:
63
~WorkBase
()
override
;
64
65
Impl
&
66
impl
()
67
{
68
return
*
static_cast<
Impl
*
>
(
this
);
69
}
70
71
void
72
run
()
override
;
73
74
void
75
cancel
()
override
;
76
77
void
78
fail
(
ErrorCode
const
& ec);
79
80
void
81
onResolve
(
ErrorCode
const
& ec,
ResultsType
results);
82
83
void
84
onConnect
(
ErrorCode
const
& ec,
EndpointType
const
& endpoint);
85
86
void
87
onStart
();
88
89
void
90
onRequest
(
ErrorCode
const
& ec);
91
92
void
93
onResponse
(
ErrorCode
const
& ec);
94
95
private
:
96
void
97
close
();
98
99
friend
Impl
;
100
};
101
102
//------------------------------------------------------------------------------
103
104
template
<
class
Impl>
105
WorkBase<Impl>::WorkBase
(
106
std::string
host,
107
std::string
path
,
108
std::string
port,
109
boost::asio::io_context& ios,
110
EndpointType
lastEndpoint,
111
bool
lastStatus,
112
CallbackType
cb)
113
:
host_
(
std
::move(host))
114
,
path_
(
std
::move(
path
))
115
,
port_
(
std
::move(port))
116
,
cb_
(
std
::move(cb))
117
,
ios_
(ios)
118
,
strand_
(
boost
::asio::make_strand(ios))
119
,
resolver_
(ios)
120
,
socket_
(ios)
121
,
lastEndpoint_
{
std
::move(lastEndpoint)}
122
,
lastStatus_
(lastStatus)
123
{
124
}
125
126
template
<
class
Impl>
127
WorkBase<Impl>::~WorkBase
()
128
{
129
if
(
cb_
)
130
cb_
(
make_error_code
(boost::system::errc::not_a_socket),
lastEndpoint_
, std::move(
res_
));
131
close
();
132
}
133
134
template
<
class
Impl>
135
void
136
WorkBase<Impl>::run
()
137
{
138
if
(!
strand_
.running_in_this_thread())
139
{
140
return
boost::asio::post(
141
ios_
, boost::asio::bind_executor(
strand_
, [self =
impl
().shared_from_this()] {
142
self->run();
143
}));
144
}
145
146
resolver_
.async_resolve(
147
host_
,
148
port_
,
149
boost::asio::bind_executor(
150
strand_
, [self =
impl
().shared_from_this()](
ErrorCode
const
& ec,
ResultsType
results) {
151
self->onResolve(ec, results);
152
}));
153
}
154
155
template
<
class
Impl>
156
void
157
WorkBase<Impl>::cancel
()
158
{
159
if
(!
strand_
.running_in_this_thread())
160
{
161
return
boost::asio::post(
162
ios_
,
163
164
boost::asio::bind_executor(
165
strand_
, [self =
impl
().shared_from_this()] { self->cancel(); }));
166
}
167
168
ErrorCode
ec;
169
resolver_
.cancel();
170
socket_
.cancel(ec);
171
}
172
173
template
<
class
Impl>
174
void
175
WorkBase<Impl>::fail
(
ErrorCode
const
& ec)
176
{
177
if
(
cb_
)
178
{
179
cb_
(ec,
lastEndpoint_
, std::move(
res_
));
180
cb_
=
nullptr
;
181
}
182
}
183
184
template
<
class
Impl>
185
void
186
WorkBase<Impl>::onResolve
(
ErrorCode
const
& ec,
ResultsType
results)
187
{
188
if
(ec)
189
return
fail
(ec);
190
191
boost::asio::async_connect(
192
socket_
,
193
results,
194
boost::asio::bind_executor(
195
strand_
,
196
[self =
impl
().shared_from_this()](
ErrorCode
const
& ec,
EndpointType
const
& endpoint) {
197
// Call the base-class overload explicitly: the derived Impl
198
// hides it with its own single-argument onConnect(ec).
199
self->WorkBase::onConnect(ec, endpoint);
200
}));
201
}
202
203
template
<
class
Impl>
204
void
205
WorkBase<Impl>::onConnect
(
ErrorCode
const
& ec,
EndpointType
const
& endpoint)
206
{
207
lastEndpoint_
= endpoint;
208
209
if
(ec)
210
return
fail
(ec);
211
212
impl
().onConnect(ec);
213
}
214
215
template
<
class
Impl>
216
void
217
WorkBase<Impl>::onStart
()
218
{
219
req_
.method(boost::beast::http::verb::get);
220
req_
.target(
path_
.empty() ?
"/"
:
path_
);
221
req_
.version(11);
222
req_
.set(
"Host"
,
host_
+
":"
+
port_
);
223
req_
.set(
"User-Agent"
,
build_info::getFullVersionString
());
224
req_
.prepare_payload();
225
boost::beast::http::async_write(
226
impl
().stream(),
227
req_
,
228
boost::asio::bind_executor(
229
strand_
, [self =
impl
().shared_from_this()](
ErrorCode
const
& ec,
std::size_t
) {
230
self->onRequest(ec);
231
}));
232
}
233
234
template
<
class
Impl>
235
void
236
WorkBase<Impl>::onRequest
(
ErrorCode
const
& ec)
237
{
238
if
(ec)
239
return
fail
(ec);
240
241
boost::beast::http::async_read(
242
impl
().stream(),
243
readBuf_
,
244
res_
,
245
boost::asio::bind_executor(
246
strand_
, [self =
impl
().shared_from_this()](
ErrorCode
const
& ec,
std::size_t
) {
247
self->onResponse(ec);
248
}));
249
}
250
251
template
<
class
Impl>
252
void
253
WorkBase<Impl>::onResponse
(
ErrorCode
const
& ec)
254
{
255
if
(ec)
256
return
fail
(ec);
257
258
close
();
259
XRPL_ASSERT(
cb_
,
"xrpl::detail::WorkBase::onResponse : callback is set"
);
260
cb_
(ec,
lastEndpoint_
, std::move(
res_
));
261
cb_
=
nullptr
;
262
}
263
264
template
<
class
Impl>
265
void
266
WorkBase<Impl>::close
()
267
{
268
if
(
socket_
.is_open())
269
{
270
ErrorCode
ec;
271
socket_
.shutdown(boost::asio::socket_base::shutdown_send, ec);
272
if
(ec)
273
return
;
274
socket_
.close(ec);
275
}
276
}
277
278
}
// namespace xrpl::detail
std::string
xrpl::detail::WorkBase::fail
void fail(ErrorCode const &ec)
Definition
WorkBase.h:175
xrpl::detail::WorkBase::ErrorCode
boost::system::error_code ErrorCode
Definition
WorkBase.h:26
xrpl::detail::WorkBase::cancel
void cancel() override
Definition
WorkBase.h:157
xrpl::detail::WorkBase::res_
ResponseType res_
Definition
WorkBase.h:47
xrpl::detail::WorkBase::resolver_
ResolverType resolver_
Definition
WorkBase.h:44
xrpl::detail::WorkBase::onResolve
void onResolve(ErrorCode const &ec, ResultsType results)
Definition
WorkBase.h:186
xrpl::detail::WorkBase::onConnect
void onConnect(ErrorCode const &ec, EndpointType const &endpoint)
Definition
WorkBase.h:205
xrpl::detail::WorkBase::req_
RequestType req_
Definition
WorkBase.h:46
xrpl::detail::WorkBase::onRequest
void onRequest(ErrorCode const &ec)
Definition
WorkBase.h:236
xrpl::detail::WorkBase::ResolverType
boost::asio::ip::tcp::resolver ResolverType
Definition
WorkBase.h:34
xrpl::detail::WorkBase::port_
std::string port_
Definition
WorkBase.h:40
xrpl::detail::WorkBase::path_
std::string path_
Definition
WorkBase.h:39
xrpl::detail::WorkBase::~WorkBase
~WorkBase() override
Definition
WorkBase.h:127
xrpl::detail::WorkBase::onResponse
void onResponse(ErrorCode const &ec)
Definition
WorkBase.h:253
xrpl::detail::WorkBase::lastStatus_
bool lastStatus_
Definition
WorkBase.h:50
xrpl::detail::WorkBase::WorkBase
WorkBase(std::string host, std::string path, std::string port, boost::asio::io_context &ios, EndpointType lastEndpoint, bool lastStatus, CallbackType cb)
Definition
WorkBase.h:105
xrpl::detail::WorkBase::EndpointType
boost::asio::ip::tcp::endpoint EndpointType
Definition
WorkBase.h:27
xrpl::detail::WorkBase::impl
Impl & impl()
Definition
WorkBase.h:66
xrpl::detail::WorkBase::socket_
SocketType socket_
Definition
WorkBase.h:45
xrpl::detail::WorkBase::ResultsType
boost::asio::ip::tcp::resolver::results_type ResultsType
Definition
WorkBase.h:35
xrpl::detail::WorkBase::lastEndpoint_
EndpointType lastEndpoint_
Definition
WorkBase.h:49
xrpl::detail::WorkBase::strand_
boost::asio::strand< boost::asio::io_context::executor_type > strand_
Definition
WorkBase.h:43
xrpl::detail::WorkBase< WorkPlain >::Impl
friend Impl
Definition
WorkBase.h:99
xrpl::detail::WorkBase::readBuf_
boost::beast::multi_buffer readBuf_
Definition
WorkBase.h:48
xrpl::detail::WorkBase::cb_
CallbackType cb_
Definition
WorkBase.h:41
xrpl::detail::WorkBase::close
void close()
Definition
WorkBase.h:266
xrpl::detail::WorkBase::CallbackType
std::function< void(ErrorCode const &, EndpointType const &, ResponseType &&)> CallbackType
Definition
WorkBase.h:30
xrpl::detail::WorkBase::RequestType
boost::beast::http::request< boost::beast::http::empty_body > RequestType
Definition
WorkBase.h:36
xrpl::detail::WorkBase::ios_
boost::asio::io_context & ios_
Definition
WorkBase.h:42
xrpl::detail::WorkBase::host_
std::string host_
Definition
WorkBase.h:38
xrpl::detail::WorkBase::run
void run() override
Definition
WorkBase.h:136
xrpl::detail::WorkBase::onStart
void onStart()
Definition
WorkBase.h:217
xrpl::detail::WorkBase::SocketType
boost::asio::ip::tcp::socket SocketType
Definition
WorkBase.h:33
xrpl::detail::Work
Definition
Work.h:11
cstddef
std::function
functional
boost
Definition
IPAddress.h:102
std
STL namespace.
xrpl::build_info::getFullVersionString
std::string const & getFullVersionString()
Full server version string.
Definition
BuildInfo.cpp:77
xrpl::detail
Definition
base_uint.h:37
xrpl::detail::ResponseType
boost::beast::http::response< boost::beast::http::string_body > ResponseType
Definition
Work.h:8
xrpl::path
Definition
FlowDebugInfo.h:21
xrpl::make_error_code
std::error_code make_error_code(xrpl::TokenCodecErrc e)
Definition
token_errors.h:78
std::size_t
string
utility
Generated by
1.17.0