From 90772cd6070bd2f2376ba7522e5d5b9c43c88375 Mon Sep 17 00:00:00 2001 From: Tindy X <49061470+tindy2013@users.noreply.github.com> Date: Thu, 19 Mar 2020 12:05:35 +0800 Subject: [PATCH] Bug fix Fix failed to load external configuration when enable_rule_generator or overwrite_original_rules is missing in YAML format configuration. Optimize codes. --- src/interfaces.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/interfaces.cpp b/src/interfaces.cpp index 6bb11df..a65cf63 100644 --- a/src/interfaces.cpp +++ b/src/interfaces.cpp @@ -64,6 +64,13 @@ template void operator >> (const YAML::Node& node, T& i) i = node.as(); }; +template T safe_as (const YAML::Node& node) +{ + if(node.IsDefined() && !node.IsNull()) + return node.as(); + return T(); +}; + std::string getRuleset(RESPONSE_CALLBACK_ARGS) { std::string url = urlsafe_base64_decode(getUrlArg(argument, "url")), type = getUrlArg(argument, "type"), group = urlsafe_base64_decode(getUrlArg(argument, "group")); @@ -268,7 +275,7 @@ void readGroup(YAML::Node node, string_array &dest) object["url"] >> url; object["interval"] >> interval; for(j = 0; j < object["rule"].size(); j++) - tempArray.emplace_back(object["rule"][j].as()); + tempArray.emplace_back(safe_as(object["rule"][j])); if(type != "select" && type != "ssid") { tempArray.emplace_back(url); @@ -551,7 +558,7 @@ void readYAMLConf(YAML::Node &node) node["advanced"]["enable_base_gen"] >> enable_base_gen; if(node["advanced"]["enable_cache"].IsDefined()) { - if(node["advanced"]["enable_cache"].as()) + if(safe_as(node["advanced"]["enable_cache"])) { node["advanced"]["cache_subscription"] >> cache_subscription; node["advanced"]["cache_config"] >> cache_config; @@ -837,8 +844,8 @@ int loadExternalYAML(YAML::Node &node, ExternalConfig &ext) section["quanx_rule_base"] >> ext.quanx_rule_base; section["loon_rule_base"] >> ext.loon_rule_base; - ext.enable_rule_generator = section["enable_rule_generator"].as(); - ext.overwrite_original_rules = section["overwrite_original_rules"].as(); + section["enable_rule_generator"] >> ext.enable_rule_generator; + section["overwrite_original_rules"] >> ext.overwrite_original_rules; if(section["custom_proxy_group"].size()) readGroup(section["custom_proxy_group"], ext.custom_proxy_group);