diff --git a/include/configs/ConfigBuilder.hpp b/include/configs/ConfigBuilder.hpp index d4eff82..8839202 100644 --- a/include/configs/ConfigBuilder.hpp +++ b/include/configs/ConfigBuilder.hpp @@ -68,4 +68,29 @@ namespace Configs { const std::shared_ptr &status); void BuildOutbound(const std::shared_ptr &ent, const std::shared_ptr &status, QJsonObject& outbound, const QString& tag); + + inline QString get_jsdelivr_link(QString link) + { + if(dataStore->routing->ruleset_mirror == Mirrors::GITHUB) + return link; + if(auto url = QUrl(link); url.isValid() && url.host() == "raw.githubusercontent.com") + { + QStringList list = url.path().split('/'); + int index = 0; + QString result = "https://cdn.jsdelivr.net/gh"; + foreach(QString item, list) + { + if(!item.isEmpty()) + { + if(index == 2) + result += "@" + item; + else + result += "/" + item; + index++; + } + } + return result; + } + return link; + } } // namespace Configs diff --git a/include/global/Const.hpp b/include/global/Const.hpp index da8a1a1..abff0c4 100644 --- a/include/global/Const.hpp +++ b/include/global/Const.hpp @@ -39,4 +39,13 @@ namespace Configs { SIMPLEDL, }; } + + namespace Mirrors + { + enum Mirrors + { + GITHUB, + JSDELIVR, + }; + } } // namespace Configs diff --git a/include/global/DataStore.hpp b/include/global/DataStore.hpp index 26b8411..5acdf16 100644 --- a/include/global/DataStore.hpp +++ b/include/global/DataStore.hpp @@ -24,6 +24,7 @@ namespace Configs { QString domain_strategy = "AsIs"; QString outbound_domain_strategy = "AsIs"; int sniffing_mode = SniffingMode::FOR_ROUTING; + int ruleset_mirror = Mirrors::JSDELIVR; explicit Routing(int preset = 0); diff --git a/include/ui/setting/dialog_manage_routes.ui b/include/ui/setting/dialog_manage_routes.ui index 6090bce..5eeb766 100644 --- a/include/ui/setting/dialog_manage_routes.ui +++ b/include/ui/setting/dialog_manage_routes.ui @@ -95,6 +95,30 @@ + + + + <html><head/><body><p>Change will apply on next launch</p></body></html> + + + Remote Rule-set Mirror + + + + + + + + GitHub + + + + + jsDelivr + + + + diff --git a/src/configs/ConfigBuilder.cpp b/src/configs/ConfigBuilder.cpp index b2f12c2..76c6159 100644 --- a/src/configs/ConfigBuilder.cpp +++ b/src/configs/ConfigBuilder.cpp @@ -753,7 +753,7 @@ namespace Configs { }; } else { - QString srsUrl = QString::fromStdString(ruleSetMap.at(item.toStdString())); + QString srsUrl = get_jsdelivr_link(QString::fromStdString(ruleSetMap.at(item.toStdString()))); ruleSetArray += QJsonObject{ {"type", "remote"}, {"tag", get_rule_set_name(srsUrl)}, diff --git a/src/global/Configs.cpp b/src/global/Configs.cpp index ebee7b3..1231839 100644 --- a/src/global/Configs.cpp +++ b/src/global/Configs.cpp @@ -343,6 +343,7 @@ namespace Configs { _add(new configItem("domain_strategy", &this->domain_strategy, itemType::string)); _add(new configItem("outbound_domain_strategy", &this->outbound_domain_strategy, itemType::string)); _add(new configItem("sniffing_mode", &this->sniffing_mode, itemType::integer)); + _add(new configItem("ruleset_mirror", &this->ruleset_mirror, itemType::integer)); _add(new configItem("use_dns_object", &this->use_dns_object, itemType::boolean)); _add(new configItem("dns_object", &this->dns_object, itemType::string)); _add(new configItem("dns_final_out", &this->dns_final_out, itemType::string)); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 7152750..f1d765c 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -421,7 +421,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi { QString err; for(int retry = 0; retry < 5; retry++) { - auto resp = NetworkRequestHelper::HttpGet("https://raw.githubusercontent.com/throneproj/routeprofiles/rule-set/list"); + auto resp = NetworkRequestHelper::HttpGet(Configs::get_jsdelivr_link("https://raw.githubusercontent.com/throneproj/routeprofiles/rule-set/list")); if (resp.error.isEmpty()) { std::vector respvec; respvec.assign(resp.data.begin(), resp.data.end()); diff --git a/src/ui/setting/dialog_manage_routes.cpp b/src/ui/setting/dialog_manage_routes.cpp index c7b615d..a03e6a9 100644 --- a/src/ui/setting/dialog_manage_routes.cpp +++ b/src/ui/setting/dialog_manage_routes.cpp @@ -104,6 +104,7 @@ DialogManageRoutes::DialogManageRoutes(QWidget *parent, const std::mapsniffing_mode->setCurrentIndex(Configs::dataStore->routing->sniffing_mode); + ui->ruleset_mirror->setCurrentIndex(Configs::dataStore->routing->ruleset_mirror); ui->outbound_domain_strategy->setCurrentText(Configs::dataStore->routing->outbound_domain_strategy); ui->domainStrategyCombo->setCurrentText(Configs::dataStore->routing->domain_strategy); ui->use_dns_object->setChecked(Configs::dataStore->routing->use_dns_object); @@ -190,6 +191,7 @@ void DialogManageRoutes::accept() { } Configs::dataStore->routing->sniffing_mode = ui->sniffing_mode->currentIndex(); + Configs::dataStore->routing->ruleset_mirror = ui->ruleset_mirror->currentIndex(); Configs::dataStore->routing->domain_strategy = ui->domainStrategyCombo->currentText(); Configs::dataStore->routing->outbound_domain_strategy = ui->outbound_domain_strategy->currentText(); Configs::dataStore->routing->use_dns_object = ui->use_dns_object->isChecked();