From 29fe7d5f92c98add68b07e9f6d66b3978b2d5003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Wed, 17 Jul 2019 15:20:57 -0400 Subject: [PATCH] http: add Resolver --- include/opendht/http.h | 21 +++++++++++++++++++-- src/http.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/include/opendht/http.h b/include/opendht/http.h index e3248a8f..9e260215 100644 --- a/include/opendht/http.h +++ b/include/opendht/http.h @@ -104,6 +104,22 @@ private: std::shared_ptr<dht::Logger> logger_; }; + +class Resolver { + Resolver(asio::io_context& ctx, const std::string& host, const std::string& service = "80"); + + using ResolvedCb = std::function<void(const asio::error_code&, const asio::ip::basic_resolver_results<asio::ip::tcp>&)>; + void addOnResolved(ResolvedCb cb); + +private: + std::mutex cbsMutex_; + asio::ip::tcp::resolver resolver_; + asio::error_code error_; + asio::ip::basic_resolver_results<asio::ip::tcp> endpoints_; + std::queue<ResolvedCb> cbs_; + bool completed_ {false}; +}; + class OPENDHT_PUBLIC Request { public: @@ -138,12 +154,13 @@ private: size_t get_content_length(const std::string str); - std::string service_; + Resolver resolver_; + /* std::string service_; std::string host_; asio::ip::tcp::resolver resolver_; asio::ip::basic_resolver_results<asio::ip::tcp> endpoints_; - +*/ Id id_; static Id ids_; std::shared_ptr<Connection> conn_; diff --git a/src/http.cpp b/src/http.cpp index c9833ac1..0ee54513 100644 --- a/src/http.cpp +++ b/src/http.cpp @@ -477,4 +477,43 @@ Request::get_content_length(const std::string str) return content_length; } + +Resolver::Resolver(asio::io_context& ctx, const std::string& host, const std::string& service) +{ + resolver_.async_resolve({host, service}, [this] + (const asio::error_code& ec, asio::ip::tcp::resolver::results_type endpoints) + { + std::lock_guard<std::mutex> lock(cbsMutex_); + while (not cbs_.empty()) { + cbs_.front()(ec, endpoints); + cbs_.pop(); + } + error_ = ec; + endpoints_ = endpoints; + completed_ = true; + } +} + +void +Resolver::addOnResolved(ResolvedCb cb) +{ + std::lock_guard<std::mutex> lock(cbsMutex_); + if (completed_) { + cb(error_, endpoints_); + } else { + cbs_.push(std::move(cb)); + } +} + +/* +private: + std::mutex cbsMutex_; + std::queue<ResolvedCb> cbs_; + + asio::ip::tcp::resolver resolver_; + asio::error_code error_; + asio::ip::basic_resolver_results<asio::ip::tcp> endpoints_; +} */ + + } // namespace http -- GitLab