diff options
Diffstat (limited to 'src/common/Asio/Resolver.h')
-rw-r--r-- | src/common/Asio/Resolver.h | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/src/common/Asio/Resolver.h b/src/common/Asio/Resolver.h index 3a123b47cb9..b63747b139e 100644 --- a/src/common/Asio/Resolver.h +++ b/src/common/Asio/Resolver.h @@ -18,34 +18,48 @@ #ifndef Resolver_h__ #define Resolver_h__ +#include "IoContext.h" #include "Optional.h" #include <boost/asio/ip/tcp.hpp> #include <string> namespace Trinity { - namespace Net + namespace Asio { - inline Optional<boost::asio::ip::tcp::endpoint> Resolve(boost::asio::ip::tcp::resolver& resolver, boost::asio::ip::tcp const& protocol, - std::string const& host, std::string const& service) + /** + Hack to make it possible to forward declare resolver (one of its template arguments is a typedef to something super long and using nested classes) + */ + class Resolver { - boost::system::error_code ec; + public: + explicit Resolver(IoContext& ioContext) : _impl(ioContext) { } + + Optional<boost::asio::ip::tcp::endpoint> Resolve(boost::asio::ip::tcp const& protocol, std::string const& host, std::string const& service) + { + boost::system::error_code ec; #if BOOST_VERSION >= 106600 - boost::asio::ip::tcp::resolver::results_type results = resolver.resolve(protocol, host, service, ec); - if (results.empty() || ec) - return {}; + boost::asio::ip::resolver_base::flags flagsResolver = boost::asio::ip::resolver_base::all_matching; + boost::asio::ip::tcp::resolver::results_type results = _impl.resolve(protocol, host, service, flagsResolver, ec); + if (results.begin() == results.end() || ec) + return {}; - return results.begin()->endpoint(); + return results.begin()->endpoint(); #else - boost::asio::ip::tcp::resolver::query query(std::move(protocol), std::move(host), std::move(service)); - boost::asio::ip::tcp::resolver::iterator itr = resolver.resolve(query, ec); - boost::asio::ip::tcp::resolver::iterator end; - if (itr == end || ec) - return {}; + boost::asio::ip::resolver_query_base::flags flagsQuery = boost::asio::ip::tcp::resolver::query::all_matching; + boost::asio::ip::tcp::resolver::query query(std::move(protocol), std::move(host), std::move(service), flagsQuery); + boost::asio::ip::tcp::resolver::iterator itr = _impl.resolve(query, ec); + boost::asio::ip::tcp::resolver::iterator end; + if (itr == end || ec) + return {}; - return itr->endpoint(); + return itr->endpoint(); #endif - } + } + + private: + boost::asio::ip::tcp::resolver _impl; + }; } } |