This commit is contained in:
2025-07-23 12:48:50 -05:00
parent 7a7d31096f
commit f94d3be7dc
4 changed files with 40 additions and 40 deletions

View File

@@ -23,7 +23,7 @@
#define REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_ #define REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_
#include "app_config.hpp" #include "app_config.hpp"
#include "comm/curl/dns_cache.hpp" #include "comm/curl/curl_shared.hpp"
#include "comm/curl/multi_request.hpp" #include "comm/curl/multi_request.hpp"
#include "comm/i_http_comm.hpp" #include "comm/i_http_comm.hpp"
#include "events/event_system.hpp" #include "events/event_system.hpp"
@@ -211,7 +211,7 @@ public:
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);
} }
dns_cache::set_cache(curl); curl_shared::set_cache(curl);
auto url = construct_url(curl, request.get_path(), cfg) + parameters; auto url = construct_url(curl, request.get_path(), cfg) + parameters;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

View File

@@ -19,11 +19,11 @@
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
#ifndef REPERTORY_INCLUDE_COMM_CURL_DNS_CACHE_HPP_ #ifndef REPERTORY_INCLUDE_COMM_CURL_CURL_SHARED_HPP_
#define REPERTORY_INCLUDE_COMM_CURL_DNS_CACHE_HPP_ #define REPERTORY_INCLUDE_COMM_CURL_CURL_SHARED_HPP_
namespace repertory { namespace repertory {
class dns_cache final { class curl_shared final {
private: private:
struct curl_sh_deleter final { struct curl_sh_deleter final {
void operator()(CURLSH *ptr) { void operator()(CURLSH *ptr) {
@@ -36,13 +36,13 @@ private:
using curl_sh_t = std::unique_ptr<CURLSH, curl_sh_deleter>; using curl_sh_t = std::unique_ptr<CURLSH, curl_sh_deleter>;
public: public:
dns_cache() = delete; curl_shared() = delete;
dns_cache(const dns_cache &) = delete; curl_shared(const curl_shared &) = delete;
dns_cache(dns_cache &&) = delete; curl_shared(curl_shared &&) = delete;
~dns_cache() = delete; ~curl_shared() = delete;
auto operator=(const dns_cache &) -> dns_cache & = delete; auto operator=(const curl_shared &) -> curl_shared & = delete;
auto operator=(dns_cache &&) -> dns_cache & = delete; auto operator=(curl_shared &&) -> curl_shared & = delete;
private: private:
static curl_sh_t cache_; static curl_sh_t cache_;
@@ -58,7 +58,7 @@ private:
public: public:
static void cleanup(); static void cleanup();
static void init(); [[nodiscard]] static auto init() -> bool;
static void set_cache(CURL *curl); static void set_cache(CURL *curl);
}; };

View File

@@ -19,29 +19,40 @@
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
#include "comm/curl/dns_cache.hpp" #include "comm/curl/curl_shared.hpp"
namespace repertory { namespace repertory {
dns_cache::curl_sh_t dns_cache::cache_; curl_shared::curl_sh_t curl_shared::cache_;
std::recursive_mutex dns_cache::mtx_; std::recursive_mutex curl_shared::mtx_;
void dns_cache::cleanup() { cache_.reset(nullptr); } void curl_shared::cleanup() {
cache_.reset(nullptr);
curl_global_cleanup();
}
auto curl_shared::init() -> bool {
auto res = curl_global_init(CURL_GLOBAL_ALL);
if (res != 0) {
return false;
}
void dns_cache::init() {
auto *cache = curl_share_init(); auto *cache = curl_share_init();
if (cache == nullptr) { if (cache == nullptr) {
return; curl_global_cleanup();
return false;
} }
cache_.reset(cache); cache_.reset(cache);
curl_share_setopt(cache, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); curl_share_setopt(cache, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt(cache, CURLSHOPT_LOCKFUNC, lock_callback); curl_share_setopt(cache, CURLSHOPT_LOCKFUNC, lock_callback);
curl_share_setopt(cache, CURLSHOPT_UNLOCKFUNC, unlock_callback); curl_share_setopt(cache, CURLSHOPT_UNLOCKFUNC, unlock_callback);
return true;
} }
void dns_cache::lock_callback(CURL * /* curl */, curl_lock_data data, void curl_shared::lock_callback(CURL * /* curl */, curl_lock_data data,
curl_lock_access /* access */, void * /* ptr */) { curl_lock_access /* access */,
void * /* ptr */) {
if (data != CURL_LOCK_DATA_DNS) { if (data != CURL_LOCK_DATA_DNS) {
return; return;
} }
@@ -49,13 +60,13 @@ void dns_cache::lock_callback(CURL * /* curl */, curl_lock_data data,
mtx_.lock(); mtx_.lock();
} }
void dns_cache::set_cache(CURL *curl) { void curl_shared::set_cache(CURL *curl) {
curl_easy_setopt(curl, CURLOPT_SHARE, cache_.get()); curl_easy_setopt(curl, CURLOPT_SHARE, cache_.get());
} }
void dns_cache::unlock_callback(CURL * /* curl */, curl_lock_data data, void curl_shared::unlock_callback(CURL * /* curl */, curl_lock_data data,
curl_lock_access /* access */, curl_lock_access /* access */,
void * /* ptr */) { void * /* ptr */) {
if (data != CURL_LOCK_DATA_DNS) { if (data != CURL_LOCK_DATA_DNS) {
return; return;
} }

View File

@@ -19,10 +19,6 @@
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
#if defined(PROJECT_ENABLE_CURL)
#include <curl/curl.h>
#endif // defined(PROJECT_ENABLE_CURL)
#if defined(PROJECT_ENABLE_OPENSSL) #if defined(PROJECT_ENABLE_OPENSSL)
#include <openssl/ssl.h> #include <openssl/ssl.h>
#endif // defined(PROJECT_ENABLE_OPENSSL) #endif // defined(PROJECT_ENABLE_OPENSSL)
@@ -49,7 +45,7 @@
#endif // defined(PROJECT_REQUIRE_ALPINE) && !defined (PROJECT_IS_MINGW) #endif // defined(PROJECT_REQUIRE_ALPINE) && !defined (PROJECT_IS_MINGW)
#if defined(PROJECT_ENABLE_CURL) #if defined(PROJECT_ENABLE_CURL)
#include "comm/curl/dns_cache.hpp" #include "comm/curl/curl_shared.hpp"
#endif // defined(PROJECT_ENABLE_CURL) #endif // defined(PROJECT_ENABLE_CURL)
namespace repertory { namespace repertory {
@@ -87,13 +83,8 @@ auto project_initialize() -> bool {
#endif // defined(PROJECT_ENABLE_OPENSSL) #endif // defined(PROJECT_ENABLE_OPENSSL)
#if defined(PROJECT_ENABLE_CURL) #if defined(PROJECT_ENABLE_CURL)
{ if (not curl_shared::init()) {
auto res = curl_global_init(CURL_GLOBAL_ALL); return false;
if (res != 0) {
return false;
}
dns_cache::init();
} }
#endif // defined(PROJECT_ENABLE_CURL) #endif // defined(PROJECT_ENABLE_CURL)
@@ -102,8 +93,7 @@ auto project_initialize() -> bool {
auto res = sqlite3_initialize(); auto res = sqlite3_initialize();
if (res != SQLITE_OK) { if (res != SQLITE_OK) {
#if defined(PROJECT_ENABLE_CURL) #if defined(PROJECT_ENABLE_CURL)
dns_cache::cleanup(); curl_shared::cleanup();
curl_global_cleanup();
#endif // defined(PROJECT_ENABLE_CURL) #endif // defined(PROJECT_ENABLE_CURL)
return false; return false;
} }
@@ -115,8 +105,7 @@ auto project_initialize() -> bool {
void project_cleanup() { void project_cleanup() {
#if defined(PROJECT_ENABLE_CURL) #if defined(PROJECT_ENABLE_CURL)
dns_cache::cleanup(); curl_shared::cleanup();
curl_global_cleanup();
#endif // defined(PROJECT_ENABLE_CURL) #endif // defined(PROJECT_ENABLE_CURL)
#if defined(PROJECT_ENABLE_SQLITE) #if defined(PROJECT_ENABLE_SQLITE)