diff --git a/include/opendht/http.h b/include/opendht/http.h index e3248a8f61d16de19d5427a29f2af47b8c7cca5c..9e2602154e845ac197c9f0e963fa045a799d7545 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 c9833ac17247b560577c4bf34a3fcda6ec567106..0ee54513fbcd9c4839d3c2959bc361ee23e51194 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