namespace ServiceLib.Handler.Fmt; public class TuicFmt : BaseFmt { public static ProfileItem? Resolve(string str, out string msg) { msg = ResUI.ConfigurationFormatIncorrect; ProfileItem item = new() { ConfigType = EConfigType.TUIC }; 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); var rawUserInfo = Utils.UrlDecode(url.UserInfo); var userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); if (userInfoParts.Length == 2) { item.Username = userInfoParts.First(); item.Password = userInfoParts.Last(); } var query = Utils.ParseQueryString(url.Query); ResolveUriQuery(query, ref item); if (GetQueryValue(query, "allow_insecure") == "1") { item.AllowInsecure = Global.StringTrue; } item.SetProtocolExtra(item.GetProtocolExtra() with { CongestionControl = GetQueryValue(query, "congestion_control") }); return item; } public static string? ToUri(ProfileItem? item) { if (item == null) { return null; } var remark = string.Empty; if (item.Remarks.IsNotEmpty()) { remark = "#" + Utils.UrlEncode(item.Remarks); } var dicQuery = new Dictionary(); ToUriQueryLite(item, ref dicQuery); if (item.GetAllowInsecure()) { dicQuery.Add("allow_insecure", "1"); } if (!item.GetProtocolExtra().CongestionControl.IsNullOrEmpty()) { dicQuery.Add("congestion_control", item.GetProtocolExtra().CongestionControl); } return ToUri(EConfigType.TUIC, item.Address, item.Port, $"{item.Username ?? ""}:{item.Password}", dicQuery, remark); } }