20 #include <ripple/basics/ResolverAsio.h>
21 #include <ripple/basics/Log.h>
22 #include <ripple/beast/net/IPAddressConversion.h>
23 #include <ripple/beast/net/IPEndpoint.h>
24 #include <boost/asio.hpp>
39 template <
class Derived>
76 m_owner->asyncHandlersComplete ();
93 (
static_cast<Derived*
>(
this))->asyncHandlersComplete();
127 template <
class StringSequence>
195 this, CompletionCounter (
this))));
218 assert (!names.
empty());
224 names, handler, CompletionCounter (
this))));
244 boost::system::error_code
const& ec,
246 boost::asio::ip::tcp::resolver::iterator iter,
249 if (ec == boost::asio::error::operation_aborted)
258 while (iter != boost::asio::ip::tcp::resolver::iterator())
265 handler (name, addresses);
269 CompletionCounter (
this))));
280 result->address().to_string(),
290 &std::isspace <std::string::value_type>,
291 std::placeholders::_1,
295 str.
begin (), str.
end (), find_whitespace);
298 str.
rbegin (), str.
rend(), find_whitespace).base();
301 if (host_first >= port_last)
305 auto const find_port_separator = [](
char const c) ->
bool
307 if (std::isspace (
static_cast<unsigned char>(c)))
317 host_first, port_last, find_port_separator);
320 host_last, port_last, find_port_separator);
339 m_work.front ().names.pop_back ();
341 if (
m_work.front ().names.empty ())
344 auto const [host, port] =
parseName (name);
349 "Unable to parse '" << name <<
"'";
353 CompletionCounter (
this))));
358 boost::asio::ip::tcp::resolver::query query (
363 std::placeholders::_1, handler,
364 std::placeholders::_2,
365 CompletionCounter (
this)));
371 assert (! names.
empty());
375 m_work.emplace_back (names, handler);
378 "Queued new job with " << names.
size() <<
379 " tasks. " <<
m_work.size() <<
" jobs outstanding.";
385 CompletionCounter (
this))));
394 boost::asio::io_service& io_service,
397 return std::make_unique<ResolverAsioImpl> (io_service, journal);