namespace ServiceLib.Handler.Fmt { public class Hysteria2Fmt : BaseFmt { public static ProfileItem? Resolve(string str, out string msg) { msg = ResUI.ConfigurationFormatIncorrect; ProfileItem item = new() { ConfigType = EConfigType.Hysteria2 }; var url = Utils.TryUri(str); if (url == null) return null; item.Address = url.IdnHost; item.Port = url.Port; item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); item.Id = Utils.UrlDecode(url.UserInfo); var query = Utils.ParseQueryString(url.Query); ResolveStdTransport(query, ref item); item.Path = Utils.UrlDecode(query["obfs-password"] ?? ""); item.AllowInsecure = (query["insecure"] ?? "") == "1" ? "true" : "false"; return item; } public static string? ToUri(ProfileItem? item) { if (item == null) return null; string url = string.Empty; string remark = string.Empty; if (Utils.IsNotEmpty(item.Remarks)) { remark = "#" + Utils.UrlEncode(item.Remarks); } var dicQuery = new Dictionary(); if (Utils.IsNotEmpty(item.Sni)) { dicQuery.Add("sni", item.Sni); } if (Utils.IsNotEmpty(item.Alpn)) { dicQuery.Add("alpn", Utils.UrlEncode(item.Alpn)); } if (Utils.IsNotEmpty(item.Path)) { dicQuery.Add("obfs", "salamander"); dicQuery.Add("obfs-password", Utils.UrlEncode(item.Path)); } dicQuery.Add("insecure", item.AllowInsecure.ToLower() == "true" ? "1" : "0"); return ToUri(EConfigType.Hysteria2, item.Address, item.Port, item.Id, dicQuery, remark); } public static ProfileItem? ResolveFull(string strData, string? subRemarks) { if (Contains(strData, "server", "up", "down", "listen", "", "")) { var fileName = WriteAllText(strData); var profileItem = new ProfileItem { CoreType = ECoreType.hysteria, Address = fileName, Remarks = subRemarks ?? "hysteria_custom" }; return profileItem; } return null; } public static ProfileItem? ResolveFull2(string strData, string? subRemarks) { if (Contains(strData, "server", "auth", "up", "down", "listen")) { var fileName = WriteAllText(strData); var profileItem = new ProfileItem { CoreType = ECoreType.hysteria2, Address = fileName, Remarks = subRemarks ?? "hysteria2_custom" }; return profileItem; } return null; } } }