#include #include #include #include #include "socket.h" #include "misc.h" #include "nodeinfo.h" #include "speedtestutil.h" #include "nodemanip.h" #include "ini_reader.h" #include "webget.h" #include "webserver.h" #include "subexport.h" //common settings string_array def_exclude_remarks, def_include_remarks, rulesets; std::vector ruleset_content_array; std::string listen_address = "127.0.0.1", default_url; int listen_port = 25500, max_pending_connections = 10, max_concurrent_threads = 4; bool api_mode = true, update_ruleset_on_request = false, overwrite_original_rules = true; extern std::string custom_group; //safety lock for multi-thread typedef std::lock_guard guarded_mutex; std::mutex on_configuring; //preferences string_array renames, emojis; bool add_emoji = false, remove_old_emoji = false; //clash custom std::string clash_rule_base; string_array clash_extra_group; //surge custom std::string surge_rule_base; std::string refreshRulesets() { guarded_mutex guard(on_configuring); eraseElements(ruleset_content_array); string_array vArray; std::string rule_group, rule_url, proxy = getSystemProxy(); ruleset_content rc; for(std::string &x : rulesets) { vArray = split(x, ","); if(vArray.size() != 2) continue; rule_group = trim(vArray[0]); rule_url = trim(vArray[1]); if(rule_url.find("[]") == 0) { std::cerr<<"Adding rule '"< &nodes, std::string &baseConf, std::vector &ruleset_content_array, string_array &extra_proxy_group, bool clashR); std::string netchToSurge(std::vector &nodes, std::string &base_conf, std::vector &ruleset_content_array, string_array &extra_proxy_group, int surge_ver); int main() { #ifdef _WIN32 WSADATA wsaData; if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { fprintf(stderr, "WSAStartup failed.\n"); return 1; } SetConsoleOutputCP(65001); #endif // _WIN32 readConf(); if(!update_ruleset_on_request) refreshRulesets(); append_response("GET", "/refreshrules", "text/plain", [](RESPONSE_CALLBACK_ARGS) -> std::string { return refreshRulesets(); }); append_response("GET", "/readconf", "text/plain", [](RESPONSE_CALLBACK_ARGS) -> std::string { readConf(); return "done"; }); append_response("GET", "/clash", "text/plain;charset=utf-8", [](RESPONSE_CALLBACK_ARGS) -> std::string { if(!api_mode) readConf(); std::string clash_base_content; std::string url = UrlDecode(getUrlArg(argument, "url")), include = UrlDecode(getUrlArg(argument, "regex")), group = UrlDecode(getUrlArg(argument, "group")); if(!url.size()) url = default_url; string_array urls = split(url, "|"); std::vector nodes; if(include.size()) { eraseElements(def_include_remarks); def_include_remarks.emplace_back(include); } if(group.size()) custom_group = group; for(std::string &x : urls) { std::cerr<<"Fetching node data from url '"< std::string { if(!api_mode) readConf(); std::string clash_base_content; std::string url = UrlDecode(getUrlArg(argument, "url")), include = UrlDecode(getUrlArg(argument, "regex")), group = UrlDecode(getUrlArg(argument, "group")); if(!url.size()) url = default_url; string_array urls = split(url, "|"); std::vector nodes; if(include.size()) { eraseElements(def_include_remarks); def_include_remarks.emplace_back(include); } if(group.size()) custom_group = group; for(std::string &x : urls) { std::cerr<<"Fetching node data from url '"< std::string { std::string url = UrlDecode(getUrlArg(argument, "url")); return webGet(url, ""); }); append_response("GET", "/getlocal", "text/plain;charset=utf-8", [](RESPONSE_CALLBACK_ARGS) -> std::string { return fileGet(UrlDecode(getUrlArg(argument, "path"))); }); } listener_args args = {listen_address, listen_port, 10240, 4}; std::cout<<"Serving HTTP @ http://"<