diff --git a/include/opendht/http.h b/include/opendht/http.h index 2812228a38d06f0edaec16a87c94415108f119a2..1626e0c32377764240fe81ef1c6117785ba94feb 100644 --- a/include/opendht/http.h +++ b/include/opendht/http.h @@ -171,6 +171,7 @@ private: Url url_; asio::error_code ec_; asio::ip::tcp::resolver resolver_; + std::shared_ptr<bool> destroyed_; std::vector<asio::ip::tcp::endpoint> endpoints_; bool completed_ {false}; diff --git a/src/http.cpp b/src/http.cpp index 9a54266ead48f6ac18dba9180fcc945c5a6a790d..5970fe030dc26de855b740513c8a1665f968154e 100644 --- a/src/http.cpp +++ b/src/http.cpp @@ -301,14 +301,14 @@ Connection::timeout(const std::chrono::seconds timeout, HandlerCb cb) // Resolver Resolver::Resolver(asio::io_context& ctx, const std::string& url, std::shared_ptr<dht::Logger> logger) - : url_(url), resolver_(ctx), logger_(logger) + : url_(url), resolver_(ctx), destroyed_(std::make_shared<bool>(false)), logger_(logger) { resolve(url_.host, url_.service); } Resolver::Resolver(asio::io_context& ctx, const std::string& host, const std::string& service, const bool ssl, std::shared_ptr<dht::Logger> logger) - : resolver_(ctx), logger_(logger) + : resolver_(ctx), destroyed_(std::make_shared<bool>(false)), logger_(logger) { url_.host = host; url_.service = service; @@ -318,7 +318,7 @@ Resolver::Resolver(asio::io_context& ctx, const std::string& host, const std::st Resolver::Resolver(asio::io_context& ctx, std::vector<asio::ip::tcp::endpoint> endpoints, const bool ssl, std::shared_ptr<dht::Logger> logger) - : resolver_(ctx), logger_(logger) + : resolver_(ctx), destroyed_(std::make_shared<bool>(false)), logger_(logger) { url_.protocol = (ssl ? "https" : "http"); endpoints_ = std::move(endpoints); @@ -338,6 +338,7 @@ Resolver::~Resolver() cb(asio::error::operation_aborted, {}); cbs.pop(); } + *destroyed_ = true; } void @@ -355,10 +356,10 @@ Resolver::resolve(const std::string& host, const std::string& service) { asio::ip::tcp::resolver::query query_(host, service); - resolver_.async_resolve(query_, [this, host, service] + resolver_.async_resolve(query_, [this, host, service, destroyed = destroyed_] (const asio::error_code& ec, asio::ip::tcp::resolver::results_type endpoints) { - if (ec == asio::error::operation_aborted) + if (ec == asio::error::operation_aborted or *destroyed) return; if (logger_){ if (ec)