mirror of
https://github.com/MetaCubeX/subconverter.git
synced 2025-11-04 18:19:42 +08:00
feat: support hysteria
This commit is contained in:
parent
e66093c868
commit
1f08e15f05
@ -340,6 +340,24 @@ void proxyToClash(std::vector<Proxy> &nodes, YAML::Node &yamlnode, const ProxyGr
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ProxyType::Hysteria:
|
||||||
|
singleproxy["type"] = "hysteria";
|
||||||
|
singleproxy["auth_str"] = x.Auth;
|
||||||
|
singleproxy["up"] = x.UpMbps;
|
||||||
|
singleproxy["down"] = x.DownMbps;
|
||||||
|
if(!x.FakeType.empty())
|
||||||
|
singleproxy["protocol"] = x.Type;
|
||||||
|
if(!x.Host.empty())
|
||||||
|
singleproxy["sni"] = x.Host;
|
||||||
|
if(!scv.is_undef())
|
||||||
|
singleproxy["skip-cert-verify"] = scv.get();
|
||||||
|
if(x.Insecure == "1")
|
||||||
|
singleproxy["skip-cert-verify"] = true;
|
||||||
|
if(!x.Alpn.empty())
|
||||||
|
singleproxy["apln"].push_back(x.Alpn);
|
||||||
|
if(!x.OBFSParam.empty())
|
||||||
|
singleproxy["obfs"] = x.OBFSParam;
|
||||||
|
break;
|
||||||
case ProxyType::Vless:
|
case ProxyType::Vless:
|
||||||
singleproxy["type"] = "vless";
|
singleproxy["type"] = "vless";
|
||||||
singleproxy["uuid"] = x.UserId;
|
singleproxy["uuid"] = x.UserId;
|
||||||
|
|||||||
@ -14,6 +14,7 @@ enum ProxyType
|
|||||||
ShadowsocksR,
|
ShadowsocksR,
|
||||||
VMess,
|
VMess,
|
||||||
Vless,
|
Vless,
|
||||||
|
Hysteria,
|
||||||
Trojan,
|
Trojan,
|
||||||
Snell,
|
Snell,
|
||||||
HTTP,
|
HTTP,
|
||||||
@ -92,12 +93,19 @@ struct Proxy
|
|||||||
|
|
||||||
uint16_t SnellVersion = 0;
|
uint16_t SnellVersion = 0;
|
||||||
String ServerName;
|
String ServerName;
|
||||||
|
|
||||||
|
String Auth;
|
||||||
|
String Alpn;
|
||||||
|
String UpMbps;
|
||||||
|
String DownMbps;
|
||||||
|
String Insecure;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SS_DEFAULT_GROUP "SSProvider"
|
#define SS_DEFAULT_GROUP "SSProvider"
|
||||||
#define SSR_DEFAULT_GROUP "SSRProvider"
|
#define SSR_DEFAULT_GROUP "SSRProvider"
|
||||||
#define V2RAY_DEFAULT_GROUP "V2RayProvider"
|
#define V2RAY_DEFAULT_GROUP "V2RayProvider"
|
||||||
#define XRAY_DEFAULT_GROUP "XRayProvider"
|
#define XRAY_DEFAULT_GROUP "XRayProvider"
|
||||||
|
#define HYSTERIA_DEFAULT_GROUP "HysteriaProvider"
|
||||||
#define SOCKS_DEFAULT_GROUP "SocksProvider"
|
#define SOCKS_DEFAULT_GROUP "SocksProvider"
|
||||||
#define HTTP_DEFAULT_GROUP "HTTPProvider"
|
#define HTTP_DEFAULT_GROUP "HTTPProvider"
|
||||||
#define TROJAN_DEFAULT_GROUP "TrojanProvider"
|
#define TROJAN_DEFAULT_GROUP "TrojanProvider"
|
||||||
|
|||||||
@ -66,6 +66,19 @@ void vmessConstruct(Proxy &node, const std::string &group, const std::string &re
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hysteriaConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &auth, const std::string &host, const std::string &up, const std::string &down, const std::string &alpn, const std::string &obfsParam, const std::string &insecure ,tribool udp, tribool tfo, tribool scv, tribool tls13)
|
||||||
|
{
|
||||||
|
commonConstruct(node, ProxyType::Hysteria, group, remarks, add, port, udp, tfo, scv, tls13);
|
||||||
|
node.Auth = auth;
|
||||||
|
node.Host = (host.empty() && !isIPv4(add) && !isIPv6(add)) ? add.data() : trim(host);
|
||||||
|
node.UpMbps = up;
|
||||||
|
node.DownMbps = down;
|
||||||
|
node.Alpn = alpn;
|
||||||
|
node.OBFSParam = obfsParam;
|
||||||
|
node.Insecure = insecure;
|
||||||
|
node.FakeType = type;
|
||||||
|
}
|
||||||
|
|
||||||
void vlessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &id, const std::string &aid, const std::string &net, const std::string &cipher, const std::string &flow, const std::string &mode, const std::string &path, const std::string &host, const std::string &edge, const std::string &tls, tribool udp, tribool tfo, tribool scv, tribool tls13)
|
void vlessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &id, const std::string &aid, const std::string &net, const std::string &cipher, const std::string &flow, const std::string &mode, const std::string &path, const std::string &host, const std::string &edge, const std::string &tls, tribool udp, tribool tfo, tribool scv, tribool tls13)
|
||||||
{
|
{
|
||||||
commonConstruct(node, ProxyType::Vless, group, remarks, add, port, udp, tfo, scv, tls13);
|
commonConstruct(node, ProxyType::Vless, group, remarks, add, port, udp, tfo, scv, tls13);
|
||||||
@ -162,6 +175,15 @@ void explodeVless(std::string vless, Proxy &node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void explodeHysteria(std::string hysteria, Proxy &node)
|
||||||
|
{
|
||||||
|
if(regMatch(hysteria, "hysteria://(.*?)[:](.*)"))
|
||||||
|
{
|
||||||
|
explodeStdHysteria(hysteria, node);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void explodeVmess(std::string vmess, Proxy &node)
|
void explodeVmess(std::string vmess, Proxy &node)
|
||||||
{
|
{
|
||||||
std::string version, ps, add, port, type, id, aid, net, path, host, tls, sni, alpn;
|
std::string version, ps, add, port, type, id, aid, net, path, host, tls, sni, alpn;
|
||||||
@ -1262,6 +1284,38 @@ void explodeStdVMess(std::string vmess, Proxy &node)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void explodeStdHysteria(std::string hysteria, Proxy &node)
|
||||||
|
{
|
||||||
|
std::string add, port, type, auth, host, insecure, up, down, alpn, obfsParam, remarks;
|
||||||
|
std::string addition;
|
||||||
|
hysteria = hysteria.substr(11);
|
||||||
|
string_size pos;
|
||||||
|
|
||||||
|
pos = hysteria.rfind("#");
|
||||||
|
if(pos != hysteria.npos)
|
||||||
|
{
|
||||||
|
remarks = urlDecode(hysteria.substr(pos + 1));
|
||||||
|
hysteria.erase(pos);
|
||||||
|
}
|
||||||
|
const std::string stdhysteria_matcher = R"(^(.*)[:](\d+)[?](.*)$)";
|
||||||
|
if(regGetMatch(hysteria, stdhysteria_matcher, 4, 0, &add, &port, &addition))
|
||||||
|
return;
|
||||||
|
type = getUrlArg(addition,"protocol");
|
||||||
|
auth = getUrlArg(addition,"auth");
|
||||||
|
host = getUrlArg(addition,"peer");
|
||||||
|
insecure = getUrlArg(addition, "insecure");
|
||||||
|
up = getUrlArg(addition,"upmbps");
|
||||||
|
down = getUrlArg(addition,"downmbps");
|
||||||
|
alpn = getUrlArg(addition,"alpn");
|
||||||
|
obfsParam = getUrlArg(addition,"obfsParam");
|
||||||
|
|
||||||
|
if(remarks.empty())
|
||||||
|
remarks = add + ":" + port;
|
||||||
|
|
||||||
|
hysteriaConstruct(node, HYSTERIA_DEFAULT_GROUP, remarks, add, port, type, auth, host, up, down, alpn, obfsParam, insecure);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
void explodeStdVless(std::string vless, Proxy &node)
|
void explodeStdVless(std::string vless, Proxy &node)
|
||||||
{
|
{
|
||||||
std::string add, port, type, id, aid, net, flow, mode, path, host, tls, remarks;
|
std::string add, port, type, id, aid, net, flow, mode, path, host, tls, remarks;
|
||||||
@ -2188,6 +2242,8 @@ void explode(const std::string &link, Proxy &node)
|
|||||||
explodeVmess(link, node);
|
explodeVmess(link, node);
|
||||||
else if(strFind(link, "vless://") || strFind(link, "vless1://"))
|
else if(strFind(link, "vless://") || strFind(link, "vless1://"))
|
||||||
explodeVless(link, node);
|
explodeVless(link, node);
|
||||||
|
else if(strFind(link, "hysteria://"))
|
||||||
|
explodeHysteria(link, node);
|
||||||
else if(strFind(link, "ss://"))
|
else if(strFind(link, "ss://"))
|
||||||
explodeSS(link, node);
|
explodeSS(link, node);
|
||||||
else if(strFind(link, "socks://") || strFind(link, "https://t.me/socks") || strFind(link, "tg://socks"))
|
else if(strFind(link, "socks://") || strFind(link, "https://t.me/socks") || strFind(link, "tg://socks"))
|
||||||
|
|||||||
@ -20,6 +20,7 @@ enum class ConfType
|
|||||||
Local
|
Local
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void hysteriaConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &auth, const std::string &host, const std::string &up, const std::string &down, const std::string &alpn, const std::string &obfsParam, const std::string &insecure ,tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool());
|
||||||
void vmessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &id, const std::string &aid, const std::string &net, const std::string &cipher, const std::string &path, const std::string &host, const std::string &edge, const std::string &tls, const std::string &sni, const std::string &alpn, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool());
|
void vmessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &id, const std::string &aid, const std::string &net, const std::string &cipher, const std::string &path, const std::string &host, const std::string &edge, const std::string &tls, const std::string &sni, const std::string &alpn, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool());
|
||||||
void vlessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &id, const std::string &aid, const std::string &net, const std::string &cipher, const std::string &flow, const std::string &mode, const std::string &path, const std::string &host, const std::string &edge, const std::string &tls, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool());
|
void vlessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &id, const std::string &aid, const std::string &net, const std::string &cipher, const std::string &flow, const std::string &mode, const std::string &path, const std::string &host, const std::string &edge, const std::string &tls, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool());
|
||||||
void ssrConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &protocol, const std::string &method, const std::string &obfs, const std::string &password, const std::string &obfsparam, const std::string &protoparam, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool());
|
void ssrConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &protocol, const std::string &method, const std::string &obfs, const std::string &password, const std::string &obfsparam, const std::string &protoparam, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool());
|
||||||
@ -30,12 +31,14 @@ void trojanConstruct(Proxy &node, const std::string &group, const std::string &r
|
|||||||
void snellConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &password, const std::string &obfs, const std::string &host, uint16_t version = 0, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool());
|
void snellConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &password, const std::string &obfs, const std::string &host, uint16_t version = 0, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool());
|
||||||
void explodeVmess(std::string vmess, Proxy &node);
|
void explodeVmess(std::string vmess, Proxy &node);
|
||||||
void explodeVless(std::string vless, Proxy &node);
|
void explodeVless(std::string vless, Proxy &node);
|
||||||
|
void explodeHysteria(std::string hysteria, Proxy &node);
|
||||||
void explodeSSR(std::string ssr, Proxy &node);
|
void explodeSSR(std::string ssr, Proxy &node);
|
||||||
void explodeSS(std::string ss, Proxy &node);
|
void explodeSS(std::string ss, Proxy &node);
|
||||||
void explodeTrojan(std::string trojan, Proxy &node);
|
void explodeTrojan(std::string trojan, Proxy &node);
|
||||||
void explodeQuan(const std::string &quan, Proxy &node);
|
void explodeQuan(const std::string &quan, Proxy &node);
|
||||||
void explodeStdVMess(std::string vmess, Proxy &node);
|
void explodeStdVMess(std::string vmess, Proxy &node);
|
||||||
void explodeStdVless(std::string vless, Proxy &node);
|
void explodeStdVless(std::string vless, Proxy &node);
|
||||||
|
void explodeStdHysteria(std::string hysteria, Proxy &node);
|
||||||
void explodeShadowrocket(std::string kit, Proxy &node);
|
void explodeShadowrocket(std::string kit, Proxy &node);
|
||||||
void explodeKitsunebi(std::string kit, Proxy &node);
|
void explodeKitsunebi(std::string kit, Proxy &node);
|
||||||
/// Parse a link
|
/// Parse a link
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user