Enhancements

Add support for Trojan-WebSocket protocol.
Fix skip-cert-verify option not correctly added to Surge subscriptions.
Optimize codes.
This commit is contained in:
Tindy X 2021-12-18 13:13:01 +08:00
parent e840006e74
commit c10766f1ad
No known key found for this signature in database
GPG Key ID: C6AD413169968D58
2 changed files with 103 additions and 87 deletions

View File

@ -308,30 +308,30 @@ void proxyToClash(std::vector<Proxy> &nodes, YAML::Node &yamlnode, const ProxyGr
singleproxy["network"] = x.TransferProtocol;
/*
singleproxy["ws-opts"]["path"] = x.Path;
if(x.Host.size())
if(!x.Host.empty())
singleproxy["ws-opts"]["headers"]["Host"] = x.Host;
if(x.Edge.size())
if(!x.Edge.empty())
singleproxy["ws-opts"]["headers"]["Edge"] = x.Edge;
*/
singleproxy["ws-path"] = x.Path;
if(x.Host.size())
if(!x.Host.empty())
singleproxy["ws-headers"]["Host"] = x.Host;
if(x.Edge.size())
if(!x.Edge.empty())
singleproxy["ws-headers"]["Edge"] = x.Edge;
break;
case "http"_hash:
singleproxy["network"] = x.TransferProtocol;
singleproxy["http-opts"]["method"] = "GET";
singleproxy["http-opts"]["path"].push_back(x.Path);
if(x.Host.size())
if(!x.Host.empty())
singleproxy["http-opts"]["headers"]["Host"].push_back(x.Host);
if(x.Edge.size())
if(!x.Edge.empty())
singleproxy["http-opts"]["headers"]["Edge"].push_back(x.Edge);
break;
case "h2"_hash:
singleproxy["network"] = x.TransferProtocol;
singleproxy["h2-opts"]["path"] = x.Path;
if(x.Host.size())
if(!x.Host.empty())
singleproxy["h2-opts"]["host"].push_back(x.Host);
break;
case "grpc"_hash:
@ -403,7 +403,7 @@ void proxyToClash(std::vector<Proxy> &nodes, YAML::Node &yamlnode, const ProxyGr
case ProxyType::Trojan:
singleproxy["type"] = "trojan";
singleproxy["password"] = x.Password;
if(x.Host.size())
if(!x.Host.empty())
singleproxy["sni"] = x.Host;
if(std::all_of(x.Password.begin(), x.Password.end(), ::isdigit) && !x.Password.empty())
singleproxy["password"].SetTag("str");
@ -418,15 +418,20 @@ void proxyToClash(std::vector<Proxy> &nodes, YAML::Node &yamlnode, const ProxyGr
if(!x.Path.empty())
singleproxy["grpc-opts"]["grpc-service-name"] = x.Path;
break;
case "ws"_hash:
singleproxy["ws-opts"]["path"] = x.Path;
if(!x.Host.empty())
singleproxy["ws-opts"]["headers"]["Host"] = x.Host;
break;
}
break;
case ProxyType::Snell:
singleproxy["type"] = "snell";
singleproxy["psk"] = x.Password;
if(x.OBFS.size())
if(!x.OBFS.empty())
{
singleproxy["obfs-opts"]["mode"] = x.OBFS;
if(x.Host.size())
if(!x.Host.empty())
singleproxy["obfs-opts"]["host"] = x.Host;
}
if(std::all_of(x.Password.begin(), x.Password.end(), ::isdigit) && !x.Password.empty())
@ -500,7 +505,7 @@ void proxyToClash(std::vector<Proxy> &nodes, YAML::Node &yamlnode, const ProxyGr
for(const auto& y : x.Proxies)
groupGenerate(y, nodelist, filtered_nodelist, true, ext);
if(x.UsingProvider.size())
if(!x.UsingProvider.empty())
singlegroup["use"] = x.UsingProvider;
else
{
@ -559,7 +564,7 @@ std::string proxyToClash(std::vector<Proxy> &nodes, const std::string &base_conf
if(!ext.enable_rule_generator)
return YAML::Dump(yamlnode);
if(ext.managed_config_prefix.size() || ext.clash_script)
if(!ext.managed_config_prefix.empty() || ext.clash_script)
{
if(yamlnode["mode"].IsDefined())
{
@ -647,13 +652,13 @@ std::string proxyToSurge(std::vector<Proxy> &nodes, const std::string &base_conf
{
proxy = "custom, " + hostname + ", " + port + ", " + method + ", " + password + ", https://github.com/ConnersHua/SSEncrypt/raw/master/SSEncrypt.module";
}
if(plugin.size())
if(!plugin.empty())
{
switch(hash_(plugin))
{
case "simple-obfs"_hash:
case "obfs-local"_hash:
if(pluginopts.size())
if(!pluginopts.empty())
proxy += "," + replaceAllDistinct(pluginopts, ";", ",");
break;
default:
@ -673,26 +678,26 @@ std::string proxyToSurge(std::vector<Proxy> &nodes, const std::string &base_conf
break;
case "ws"_hash:
proxy += ", ws=true, ws-path=" + path + ", sni=" + host + ", ws-headers=Host:" + host;
if(edge.size())
if(!edge.empty())
proxy += "|Edge:" + edge;
break;
default:
continue;
}
if(!scv.is_undef())
proxy += ", skip-cert-verify=" + std::string(scv.get() ? "1" : "0");
proxy += ", skip-cert-verify=" + scv.get_str();
break;
case ProxyType::ShadowsocksR:
if(ext.surge_ssr_path.empty() || surge_ver < 2)
continue;
proxy = "external, exec=\"" + ext.surge_ssr_path + "\", args=\"";
args = {"-l", std::to_string(local_port), "-s", hostname, "-p", port, "-m", method, "-k", password, "-o", obfs, "-O", protocol};
if(obfsparam.size())
if(!obfsparam.empty())
{
args.emplace_back("-g");
args.emplace_back(std::move(obfsparam));
}
if(protoparam.size())
if(!protoparam.empty())
{
args.emplace_back("-G");
args.emplace_back(std::move(protoparam));
@ -707,35 +712,35 @@ std::string proxyToSurge(std::vector<Proxy> &nodes, const std::string &base_conf
break;
case ProxyType::SOCKS5:
proxy = "socks5, " + hostname + ", " + port;
if(username.size())
if(!username.empty())
proxy += ", username=" + username;
if(password.size())
if(!password.empty())
proxy += ", password=" + password;
if(!scv.is_undef())
proxy += ", skip-cert-verify=" + std::string(scv.get() ? "1" : "0");
proxy += ", skip-cert-verify=" + scv.get_str();
break;
case ProxyType::HTTP:
proxy = "http, " + hostname + ", " + port;
if(username.size())
if(!username.empty())
proxy += ", username=" + username;
if(password.size())
if(!password.empty())
proxy += ", password=" + password;
proxy += std::string(", tls=") + (x.TLSSecure ? "true" : "false");
if(!scv.is_undef())
proxy += ", skip-cert-verify=" + std::string(scv.get() ? "1" : "0");
proxy += ", skip-cert-verify=" + scv.get_str();
break;
case ProxyType::Trojan:
if(surge_ver < 4)
continue;
proxy = "trojan, " + hostname + ", " + port + ", password=" + password;
if(host.size())
if(!host.empty())
proxy += ", sni=" + host;
if(!scv.is_undef())
proxy += ", skip-cert-verify=" + std::string(scv.get() ? "1" : "0");
proxy += ", skip-cert-verify=" + scv.get_str();
break;
case ProxyType::Snell:
proxy = "snell, " + hostname + ", " + port + ", psk=" + password;
if(obfs.size())
if(!obfs.empty())
proxy += ", obfs=" + obfs + ", obfs-host=" + host;
break;
default:
@ -789,7 +794,7 @@ std::string proxyToSurge(std::vector<Proxy> &nodes, const std::string &base_conf
for(const auto &y : x.Proxies)
groupGenerate(y, nodelist, filtered_nodelist, true, ext);
if(!filtered_nodelist.size())
if(filtered_nodelist.empty())
filtered_nodelist.emplace_back("DIRECT");
if(filtered_nodelist.size() == 1)
@ -852,7 +857,7 @@ std::string proxyToSingle(std::vector<Proxy> &nodes, int types, extra_settings &
if(ss)
{
proxyStr = "ss://" + urlSafeBase64Encode(method + ":" + password) + "@" + hostname + ":" + port;
if(plugin.size() && pluginopts.size())
if(!plugin.empty() && !pluginopts.empty())
{
proxyStr += "/?plugin=" + urlEncode(plugin + ";" + pluginopts);
}
@ -860,7 +865,7 @@ std::string proxyToSingle(std::vector<Proxy> &nodes, int types, extra_settings &
}
else if(ssr)
{
if(std::count(ssr_ciphers.begin(), ssr_ciphers.end(), method) > 0 && !GetMember(json, "Plugin").size() && !GetMember(json, "Plugin").size())
if(std::count(ssr_ciphers.begin(), ssr_ciphers.end(), method) > 0 && GetMember(json, "Plugin").empty() && GetMember(json, "Plugin").empty())
proxyStr = "ssr://" + urlSafeBase64Encode(hostname + ":" + port + ":origin:" + method + ":plain:" + urlSafeBase64Encode(password) \
+ "/?group=" + urlSafeBase64Encode(x.Group) + "&remarks=" + urlSafeBase64Encode(remark));
}
@ -997,7 +1002,7 @@ std::string proxyToQuan(std::vector<Proxy> &nodes, const std::string &base_conf,
string_array allnodes;
std::string allLinks;
ini.GetAll("SERVER", "{NONAME}", allnodes);
if(allnodes.size())
if(!allnodes.empty())
allLinks = join(allnodes, "\n");
return base64Encode(allLinks);
}
@ -1047,7 +1052,7 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
if(transproto == "ws")
{
proxyStr += ", obfs=ws, obfs-path=\"" + path + "\", obfs-header=\"Host: " + host;
if(edge.size())
if(!edge.empty())
proxyStr += "[Rr][Nn]Edge: " + edge;
proxyStr += "\"";
}
@ -1065,9 +1070,9 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
else
{
proxyStr = remark + " = shadowsocksr, " + hostname + ", " + port + ", " + method + ", \"" + password + "\", group=" + x.Group + ", protocol=" + protocol + ", obfs=" + obfs;
if(protoparam.size())
if(!protoparam.empty())
proxyStr += ", protocol_param=" + protoparam;
if(obfsparam.size())
if(!obfsparam.empty())
proxyStr += ", obfs_param=" + obfsparam;
}
break;
@ -1075,7 +1080,7 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
if(ext.nodelist)
{
proxyStr = "ss://" + urlSafeBase64Encode(method + ":" + password) + "@" + hostname + ":" + port;
if(plugin.size() && pluginopts.size())
if(!plugin.empty() && !pluginopts.empty())
{
proxyStr += "/?plugin=" + urlEncode(plugin + ";" + pluginopts);
}
@ -1084,7 +1089,7 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
else
{
proxyStr = remark + " = shadowsocks, " + hostname + ", " + port + ", " + method + ", \"" + password + "\", group=" + x.Group;
if(plugin == "obfs-local" && pluginopts.size())
if(plugin == "obfs-local" && !pluginopts.empty())
{
proxyStr += ", " + replaceAllDistinct(pluginopts, ";", ", ");
}
@ -1092,7 +1097,7 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
break;
case ProxyType::HTTP:
proxyStr = remark + " = http, upstream-proxy-address=" + hostname + ", upstream-proxy-port=" + port + ", group=" + x.Group;
if(username.size() && password.size())
if(!username.empty() && !password.empty())
proxyStr += ", upstream-proxy-auth=true, upstream-proxy-username=" + username + ", upstream-proxy-password=" + password;
else
proxyStr += ", upstream-proxy-auth=false";
@ -1100,7 +1105,7 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
if(tlssecure)
{
proxyStr += ", over-tls=true";
if(host.size())
if(!host.empty())
proxyStr += ", tls-host=" + host;
if(!scv.is_undef())
proxyStr += ", certificate=" + std::string(scv.get() ? "0" : "1");
@ -1111,7 +1116,7 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
break;
case ProxyType::SOCKS5:
proxyStr = remark + " = socks, upstream-proxy-address=" + hostname + ", upstream-proxy-port=" + port + ", group=" + x.Group;
if(username.size() && password.size())
if(!username.empty() && !password.empty())
proxyStr += ", upstream-proxy-auth=true, upstream-proxy-username=" + username + ", upstream-proxy-password=" + password;
else
proxyStr += ", upstream-proxy-auth=false";
@ -1119,7 +1124,7 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
if(tlssecure)
{
proxyStr += ", over-tls=true";
if(host.size())
if(!host.empty())
proxyStr += ", tls-host=" + host;
if(!scv.is_undef())
proxyStr += ", certificate=" + std::string(scv.get() ? "0" : "1");
@ -1175,7 +1180,7 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
}
content += rem_a + rem_b + "\n";
}
if(celluar.size())
if(!celluar.empty())
singlegroup += ", celluar = " + celluar;
singlegroup += "\n" + replaceAllDistinct(trimOf(content, ','), ",", "\n");
ini.Set("{NONAME}", base64Encode(singlegroup)); //insert order
@ -1188,7 +1193,7 @@ void proxyToQuan(std::vector<Proxy> &nodes, INIReader &ini, std::vector<RulesetC
for(const auto &y : x.Proxies)
groupGenerate(y, nodelist, filtered_nodelist, true, ext);
if(!filtered_nodelist.size())
if(filtered_nodelist.empty())
filtered_nodelist.emplace_back("direct");
if(filtered_nodelist.size() < 2) // force groups with 1 node to be static
@ -1231,7 +1236,7 @@ std::string proxyToQuanX(std::vector<Proxy> &nodes, const std::string &base_conf
string_array allnodes;
std::string allLinks;
ini.GetAll("server_local", "{NONAME}", allnodes);
if(allnodes.size())
if(!allnodes.empty())
allLinks = join(allnodes, "\n");
return allLinks;
}
@ -1293,13 +1298,13 @@ void proxyToQuanX(std::vector<Proxy> &nodes, INIReader &ini, std::vector<Ruleset
break;
case ProxyType::Shadowsocks:
proxyStr = "shadowsocks = " + hostname + ":" + port + ", method=" + method + ", password=" + password;
if(plugin.size())
if(!plugin.empty())
{
switch(hash_(plugin))
{
case "simple-obfs"_hash:
case "obfs-local"_hash:
if(pluginopts.size())
if(!pluginopts.empty())
proxyStr += ", " + replaceAllDistinct(pluginopts, ";", ", ");
break;
case "v2ray-plugin"_hash:
@ -1315,9 +1320,9 @@ void proxyToQuanX(std::vector<Proxy> &nodes, INIReader &ini, std::vector<Ruleset
proxyStr += ", tls13=" + std::string(tls13 ? "true" : "false");
}
proxyStr += ", obfs=" + plugin;
if(host.size())
if(!host.empty())
proxyStr += ", obfs-host=" + host;
if(path.size())
if(!path.empty())
proxyStr += ", obfs-uri=" + path;
break;
default: continue;
@ -1327,14 +1332,14 @@ void proxyToQuanX(std::vector<Proxy> &nodes, INIReader &ini, std::vector<Ruleset
break;
case ProxyType::ShadowsocksR:
proxyStr = "shadowsocks = " + hostname + ":" + port + ", method=" + method + ", password=" + password + ", ssr-protocol=" + protocol;
if(protoparam.size())
if(!protoparam.empty())
proxyStr += ", ssr-protocol-param=" + protoparam;
proxyStr += ", obfs=" + obfs;
if(obfsparam.size())
if(!obfsparam.empty())
proxyStr += ", obfs-host=" + obfsparam;
break;
case ProxyType::HTTP:
proxyStr = "http = " + hostname + ":" + port + ", username=" + (username.size() ? username : "none") + ", password=" + (password.size() ? password : "none");
proxyStr = "http = " + hostname + ":" + port + ", username=" + (username.empty() ? "none" : username) + ", password=" + (password.empty() ? "none" : password);
if(tlssecure)
{
proxyStr += ", over-tls=true";
@ -1409,7 +1414,7 @@ void proxyToQuanX(std::vector<Proxy> &nodes, INIReader &ini, std::vector<Ruleset
for(const auto &y : x.Proxies)
groupGenerate(y, nodelist, filtered_nodelist, true, ext);
if(!filtered_nodelist.size())
if(filtered_nodelist.empty())
filtered_nodelist.emplace_back("direct");
if(filtered_nodelist.size() < 2) // force groups with 1 node to be static
@ -1448,7 +1453,7 @@ void proxyToQuanX(std::vector<Proxy> &nodes, INIReader &ini, std::vector<Ruleset
string_multimap scripts;
std::string content, title, url;
const std::string pattern = "^(.*? url script-.*? )(.*?)$";
if(ini.SectionExist("rewrite_local") && ext.quanx_dev_id.size())
if(ini.SectionExist("rewrite_local") && !ext.quanx_dev_id.empty())
{
ini.GetItems("rewrite_local", scripts);
ini.EraseSection("rewrite_local");
@ -1475,7 +1480,7 @@ void proxyToQuanX(std::vector<Proxy> &nodes, INIReader &ini, std::vector<Ruleset
}
eraseElements(scripts);
string_size pos;
if(ini.SectionExist("rewrite_remote") && ext.quanx_dev_id.size())
if(ini.SectionExist("rewrite_remote") && !ext.quanx_dev_id.empty())
{
ini.GetItems("rewrite_remote", scripts);
ini.EraseSection("rewrite_remote");
@ -1507,7 +1512,7 @@ std::string proxyToSSD(std::vector<Proxy> &nodes, std::string &group, std::strin
rapidjson::Writer<rapidjson::StringBuffer> writer(sb);
size_t index = 0;
if(!group.size())
if(group.empty())
group = "SSD";
writer.StartObject();
@ -1519,7 +1524,7 @@ std::string proxyToSSD(std::vector<Proxy> &nodes, std::string &group, std::strin
writer.String("aes-128-gcm");
writer.Key("password");
writer.String("password");
if(userinfo.size())
if(!userinfo.empty())
{
std::string data = replaceAllDistinct(userinfo, "; ", "&");
std::string upload = getUrlArg(data, "upload"), download = getUrlArg(data, "download"), total = getUrlArg(data, "total"), expiry = getUrlArg(data, "expire");
@ -1528,7 +1533,7 @@ std::string proxyToSSD(std::vector<Proxy> &nodes, std::string &group, std::strin
writer.Double(used);
writer.Key("traffic_total");
writer.Double(tot);
if(expiry.size())
if(!expiry.empty())
{
const time_t rawtime = to_int(expiry);
char buffer[30];
@ -1649,13 +1654,13 @@ void proxyToMellow(std::vector<Proxy> &nodes, INIReader &ini, std::vector<Rulese
switch(x.Type)
{
case ProxyType::Shadowsocks:
if(x.Plugin.size())
if(!x.Plugin.empty())
continue;
proxy = remark + ", ss, ss://" + urlSafeBase64Encode(method + ":" + password) + "@" + hostname + ":" + port;
break;
case ProxyType::VMess:
proxy = remark + ", vmess1, vmess1://" + id + "@" + hostname + ":" + port;
if(path.size())
if(!path.empty())
proxy += path;
proxy += "?network=" + transproto;
switch(hash_(transproto))
@ -1724,9 +1729,9 @@ void proxyToMellow(std::vector<Proxy> &nodes, INIReader &ini, std::vector<Rulese
for(const auto &y : x.Proxies)
groupGenerate(y, nodelist, filtered_nodelist, false, ext);
if(!filtered_nodelist.size())
if(filtered_nodelist.empty())
{
if(!remarks_list.size())
if(remarks_list.empty())
filtered_nodelist.emplace_back("DIRECT");
else
filtered_nodelist = remarks_list;
@ -1804,10 +1809,10 @@ std::string proxyToLoon(std::vector<Proxy> &nodes, const std::string &base_conf,
proxy = "Shadowsocks," + hostname + "," + port + "," + method + ",\"" + password + "\"";
if(plugin == "simple-obfs" || plugin == "obfs-local")
{
if(pluginopts.size())
if(!pluginopts.empty())
proxy += "," + replaceAllDistinct(replaceAllDistinct(pluginopts, ";obfs-host=", ","), "obfs=", "");
}
else if(plugin.size())
else if(!plugin.empty())
continue;
break;
case ProxyType::VMess:
@ -1846,7 +1851,7 @@ std::string proxyToLoon(std::vector<Proxy> &nodes, const std::string &base_conf,
break;
case ProxyType::Trojan:
proxy = "trojan," + hostname + "," + port + "," + password;
if(host.size())
if(!host.empty())
proxy += ",tls-name:" + host;
if(!scv.is_undef())
proxy += ",skip-cert-verify:" + std::string(scv.get() ? "1" : "0");
@ -1902,7 +1907,7 @@ std::string proxyToLoon(std::vector<Proxy> &nodes, const std::string &base_conf,
for(const auto &y : x.Proxies)
groupGenerate(y, nodelist, filtered_nodelist, true, ext);
if(!filtered_nodelist.size())
if(filtered_nodelist.empty())
filtered_nodelist.emplace_back("DIRECT");
proxy = x.TypeStr() + ",";

View File

@ -161,7 +161,7 @@ void explodeVmess(std::string vmess, Proxy &node)
switch(to_int(version))
{
case 1:
if(host.size())
if(!host.empty())
{
vArray = split(host, ";");
if(vArray.size() == 2)
@ -286,7 +286,7 @@ void explodeVmessConf(std::string content, std::vector<Proxy> &nodes)
continue;
json["vmess"][i]["subid"] >> subid;
if(subid.size())
if(!subid.empty())
{
iter = subdata.find(subid);
if(iter != subdata.end())
@ -346,8 +346,9 @@ void explodeSS(std::string ss, Proxy &node)
plugins = urlDecode(getUrlArg(addition, "plugin"));
plugin = plugins.substr(0, plugins.find(";"));
pluginopts = plugins.substr(plugins.find(";") + 1);
if(getUrlArg(addition, "group").size())
group = urlSafeBase64Decode(getUrlArg(addition, "group"));
group = getUrlArg(addition, "group");
if(!group.empty())
group = urlSafeBase64Decode(group);
ss.erase(ss.find("?"));
}
if(strFind(ss, "@"))
@ -723,7 +724,7 @@ void explodeHTTPSub(std::string link, Proxy &node)
void explodeTrojan(std::string trojan, Proxy &node)
{
std::string server, port, psk, addition, group, remark, host;
std::string server, port, psk, addition, group, remark, host, path, network;
tribool tfo, scv;
trojan.erase(0, 9);
string_size pos = trojan.rfind("#");
@ -750,6 +751,12 @@ void explodeTrojan(std::string trojan, Proxy &node)
scv = getUrlArg(addition, "allowInsecure");
group = urlDecode(getUrlArg(addition, "group"));
if(getUrlArg(addition, "ws") == "1")
{
path = getUrlArg(addition, "wspath");
network = "ws";
}
if(remark.empty())
remark = server + ":" + port;
if(host.empty() && !isIPv4(server) && !isIPv6(server))
@ -757,7 +764,7 @@ void explodeTrojan(std::string trojan, Proxy &node)
if(group.empty())
group = TROJAN_DEFAULT_GROUP;
trojanConstruct(node, group, remark, server, port, psk, "", host, "", true, tribool(), tfo, scv);
trojanConstruct(node, group, remark, server, port, psk, network, host, path, true, tribool(), tfo, scv);
}
void explodeQuan(const std::string &quan, Proxy &node)
@ -1044,11 +1051,11 @@ void explodeClash(Node yamlnode, std::vector<Proxy> &nodes)
break;
case "v2ray-plugin"_hash:
pluginopts = "mode=" + pluginopts_mode + ";" + tls + pluginopts_mux;
if(pluginopts_host.size())
if(!pluginopts_host.empty())
pluginopts += "host=" + pluginopts_host + ";";
if(path.size())
if(!path.empty())
pluginopts += "path=" + path + ";";
if(pluginopts_mux.size())
if(!pluginopts_mux.empty())
pluginopts += "mux=" + pluginopts_mux + ";";
break;
}
@ -1104,15 +1111,19 @@ void explodeClash(Node yamlnode, std::vector<Proxy> &nodes)
group = TROJAN_DEFAULT_GROUP;
singleproxy["password"] >>= password;
singleproxy["sni"] >>= host;
if(safe_as<std::string>(singleproxy["network"]) == "grpc")
singleproxy["network"] >>= net;
switch(hash_(net))
{
net = "grpc";
case "grpc"_hash:
singleproxy["grpc-opts"]["grpc-service-name"] >>= path;
}
else
{
break;
case "ws"_hash:
singleproxy["ws-opts"]["path"] >>= path;
break;
default:
net = "tcp";
path.clear();
break;
}
trojanConstruct(node, group, ps, server, port, password, net, host, path, true, udp, tfo, scv);
@ -1198,7 +1209,7 @@ void explodeShadowrocket(std::string rocket, Proxy &node)
return;
remarks = urlDecode(getUrlArg(addition, "remarks"));
obfs = getUrlArg(addition, "obfs");
if(obfs.size())
if(!obfs.empty())
{
if(obfs == "websocket")
{
@ -1368,7 +1379,7 @@ bool explodeSurge(std::string surge, std::vector<Proxy> &nodes)
continue;
}
}
if(plugin.size())
if(!plugin.empty())
{
pluginopts = "obfs=" + pluginopts_mode;
pluginopts += pluginopts_host.empty() ? "" : ";obfs-host=" + pluginopts_host;
@ -1417,7 +1428,7 @@ bool explodeSurge(std::string surge, std::vector<Proxy> &nodes)
continue;
}
}
if(plugin.size())
if(!plugin.empty())
{
pluginopts = "obfs=" + pluginopts_mode;
pluginopts += pluginopts_host.empty() ? "" : ";obfs-host=" + pluginopts_host;
@ -1714,22 +1725,22 @@ bool explodeSurge(std::string surge, std::vector<Proxy> &nodes)
{
case "simple-obfs"_hash:
pluginopts = "obfs=" + pluginopts_mode;
if(pluginopts_host.size())
if(!pluginopts_host.empty())
pluginopts += ";obfs-host=" + pluginopts_host;
break;
case "v2ray-plugin"_hash:
if(pluginopts_host.empty() && !isIPv4(server) && !isIPv6(server))
pluginopts_host = server;
pluginopts = "mode=" + pluginopts_mode;
if(pluginopts_host.size())
if(!pluginopts_host.empty())
pluginopts += ";host=" + pluginopts_host;
if(path.size())
if(!path.empty())
pluginopts += ";path=" + path;
pluginopts += ";" + tls;
break;
}
if(protocol.size())
if(!protocol.empty())
{
ssrConstruct(node, SSR_DEFAULT_GROUP, remarks, server, port, protocol, method, pluginopts_mode, password, pluginopts_host, protoparam, udp, tfo, scv);
}
@ -2053,7 +2064,7 @@ int explodeConfContent(const std::string &content, std::vector<Proxy> &nodes)
explodeSub(content, nodes);
}
return nodes.size() != 0;
return !nodes.empty();
}
void explode(const std::string &link, Proxy &node)
@ -2134,7 +2145,7 @@ void explodeSub(std::string sub, std::vector<Proxy> &nodes)
if(strLink.rfind("\r") != strLink.npos)
strLink.erase(strLink.size() - 1);
explode(strLink, node);
if(strLink.size() == 0 || node.Type == ProxyType::Unknow)
if(strLink.empty() || node.Type == ProxyType::Unknow)
{
continue;
}