std::vector<std::vector<std::string>> g_pubs;
-void initPublicSuffixList(const std::string& file)
+static bool initPublicSuffixList(const std::string& file, std::istream& stream, std::vector<std::vector<std::string>>& pbList)
{
- std::vector<std::vector<std::string>> pbList;
- bool loaded = false;
- if (!file.empty()) {
- try {
- Regex reg("^[.0-9a-z-]*$");
- std::ifstream suffixFile(file);
- if (!suffixFile.is_open()) {
- throw std::runtime_error("Error opening the public suffix list file");
- }
+ try {
+ Regex reg("^[.0-9a-z-]*$");
- std::string line;
- while (std::getline(suffixFile, line)) {
- if (line.empty() || (line.rfind("//", 0) == 0)) {
- /* skip empty and commented lines */
+ std::string line;
+ while (std::getline(stream, line)) {
+ if (line.empty() || (line.rfind("//", 0) == 0)) {
+ /* skip empty and commented lines */
+ continue;
+ }
+ try {
+ line = toLower(line);
+ if (!reg.match(line)) {
continue;
}
- try {
- line = toLower(line);
- if (!reg.match(line)) {
- continue;
- }
- DNSName name(toLower(line));
- if (name.countLabels() < 2) {
- continue;
- }
- pbList.emplace_back(name.labelReverse().getRawLabels());
- }
- catch (...) {
- /* not a DNS name, ignoring */
+ DNSName name(line);
+ if (name.countLabels() < 2) {
continue;
}
+ pbList.emplace_back(name.labelReverse().getRawLabels());
+ }
+ catch (...) {
+ /* not a DNS name, ignoring */
+ continue;
}
+ }
+ if (file != "internal") {
g_slog->withName("runtime")->info(Logr::Info, "Loaded the Public Suffix List", "file", Logging::Loggable(file));
- loaded = true;
+ }
+ return true;
+ }
+ catch (const std::exception& e) {
+ g_slog->withName("runtime")->error(Logr::Error, e.what(), "Error while loading the Public Suffix List", "file", Logging::Loggable(file));
+ }
+ return false;
+}
+
+void initPublicSuffixList(const std::string& file)
+{
+ bool loaded = false;
+ std::vector<std::vector<std::string>> pbList;
+
+ if (!file.empty()) {
+ try {
+ std::ifstream suffixFile(file);
+ if (!suffixFile.is_open()) {
+ throw std::runtime_error("Error opening the public suffix list file");
+ }
+ loaded = initPublicSuffixList(file, suffixFile, pbList);
}
catch (const std::exception& e) {
g_slog->withName("runtime")->error(Logr::Error, e.what(), "Error while loading the Public Suffix List", "file", Logging::Loggable(file));
if (!loaded) {
pbList.clear();
-
- for (const auto& entry : g_pubsuffix) {
- const auto low = toLower(entry);
- std::vector<std::string> parts;
- stringtok(parts, low, ".");
- std::reverse(parts.begin(), parts.end());
- parts.shrink_to_fit();
- pbList.emplace_back(std::move(parts));
- }
+ std::istringstream stream(g_pubsuffix);
+ initPublicSuffixList("internal", stream, pbList);
}
-
std::sort(pbList.begin(), pbList.end());
g_pubs = std::move(pbList);
}