#include #include #include #include #include #include #include #include #include static std::unordered_map cache; static std::optional cached_is_domain_blocked(const char *hostname) { auto fres = cache.find(hostname); if (fres != cache.end()) { return fres->second; } return {}; } extern "C" bool is_domain_blocked(const char *hostname) { bool fres; // Check cache first { auto fres = cached_is_domain_blocked(hostname); if (fres.has_value()) { return fres.value(); } } // Use curlpp to check for HTTP != 200 try { // Send request curlpp::Cleanup cleanup; curlpp::Easy req; req.setOpt(std::string("http://")+hostname); req.setOpt(true); req.setOpt(6); req.perform(); // Get status code auto status = curlpp::infos::ResponseCode::get(req); // Check result fres = status == 403; } catch (...) { fres = true; } // Store result in cache cache[hostname] = fres; // Debug result printf("Domain %s is%s\n", hostname, fres?" probably blocked":"n't blocked"); // Return result return fres; }