v2rayN/v2rayN/ServiceLib/Handler/Fmt/BaseFmt.cs

239 lines
9.5 KiB
C#
Raw Normal View History

2024-06-04 01:48:04 +00:00
using System.Collections.Specialized;
2024-08-19 10:15:54 +00:00
namespace ServiceLib.Handler.Fmt
2024-06-04 01:48:04 +00:00
{
2024-08-19 10:15:54 +00:00
public class BaseFmt
2024-06-04 01:48:04 +00:00
{
protected static string GetIpv6(string address)
{
if (Utils.IsIpv6(address))
{
// 检查地址是否已经被方括号包围,如果没有,则添加方括号
return address.StartsWith('[') && address.EndsWith(']') ? address : $"[{address}]";
}
return address; // 如果不是IPv6地址直接返回原地址
}
protected static int GetStdTransport(ProfileItem item, string? securityDef, ref Dictionary<string, string> dicQuery)
{
if (Utils.IsNotEmpty(item.Flow))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("flow", item.Flow);
2024-06-04 01:48:04 +00:00
}
if (Utils.IsNotEmpty(item.StreamSecurity))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("security", item.StreamSecurity);
2024-06-04 01:48:04 +00:00
}
else
{
if (securityDef != null)
{
dicQuery.Add("security", securityDef);
}
}
if (Utils.IsNotEmpty(item.Sni))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("sni", item.Sni);
2024-06-04 01:48:04 +00:00
}
if (Utils.IsNotEmpty(item.Alpn))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("alpn", Utils.UrlEncode(item.Alpn));
2024-06-04 01:48:04 +00:00
}
if (Utils.IsNotEmpty(item.Fingerprint))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("fp", Utils.UrlEncode(item.Fingerprint));
2024-06-04 01:48:04 +00:00
}
if (Utils.IsNotEmpty(item.PublicKey))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("pbk", Utils.UrlEncode(item.PublicKey));
2024-06-04 01:48:04 +00:00
}
if (Utils.IsNotEmpty(item.ShortId))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("sid", Utils.UrlEncode(item.ShortId));
2024-06-04 01:48:04 +00:00
}
if (Utils.IsNotEmpty(item.SpiderX))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("spx", Utils.UrlEncode(item.SpiderX));
2024-06-04 01:48:04 +00:00
}
if (item.AllowInsecure.Equals("true"))
2024-07-11 06:42:01 +00:00
{
dicQuery.Add("allowInsecure", "1");
}
2024-06-04 01:48:04 +00:00
dicQuery.Add("type", Utils.IsNotEmpty(item.Network) ? item.Network : nameof(ETransport.tcp));
2024-06-04 01:48:04 +00:00
switch (item.Network)
2024-06-04 01:48:04 +00:00
{
case nameof(ETransport.tcp):
dicQuery.Add("headerType", Utils.IsNotEmpty(item.HeaderType) ? item.HeaderType : Global.None);
if (Utils.IsNotEmpty(item.RequestHost))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("host", Utils.UrlEncode(item.RequestHost));
2024-06-04 01:48:04 +00:00
}
break;
case nameof(ETransport.kcp):
dicQuery.Add("headerType", Utils.IsNotEmpty(item.HeaderType) ? item.HeaderType : Global.None);
if (Utils.IsNotEmpty(item.Path))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("seed", Utils.UrlEncode(item.Path));
2024-06-04 01:48:04 +00:00
}
break;
case nameof(ETransport.ws):
case nameof(ETransport.httpupgrade):
if (Utils.IsNotEmpty(item.RequestHost))
{
dicQuery.Add("host", Utils.UrlEncode(item.RequestHost));
}
if (Utils.IsNotEmpty(item.Path))
{
dicQuery.Add("path", Utils.UrlEncode(item.Path));
}
break;
2024-11-13 11:48:44 +00:00
case nameof(ETransport.xhttp):
if (Utils.IsNotEmpty(item.RequestHost))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("host", Utils.UrlEncode(item.RequestHost));
2024-06-04 01:48:04 +00:00
}
if (Utils.IsNotEmpty(item.Path))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("path", Utils.UrlEncode(item.Path));
2024-06-04 01:48:04 +00:00
}
if (Utils.IsNotEmpty(item.HeaderType) && Global.XhttpMode.Contains(item.HeaderType))
{
dicQuery.Add("mode", Utils.UrlEncode(item.HeaderType));
}
if (Utils.IsNotEmpty(item.Extra))
{
dicQuery.Add("extra", Utils.UrlEncode(item.Extra));
}
2024-06-04 01:48:04 +00:00
break;
case nameof(ETransport.http):
case nameof(ETransport.h2):
dicQuery["type"] = nameof(ETransport.http);
if (Utils.IsNotEmpty(item.RequestHost))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("host", Utils.UrlEncode(item.RequestHost));
2024-06-04 01:48:04 +00:00
}
if (Utils.IsNotEmpty(item.Path))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("path", Utils.UrlEncode(item.Path));
2024-06-04 01:48:04 +00:00
}
break;
case nameof(ETransport.quic):
dicQuery.Add("headerType", Utils.IsNotEmpty(item.HeaderType) ? item.HeaderType : Global.None);
dicQuery.Add("quicSecurity", Utils.UrlEncode(item.RequestHost));
dicQuery.Add("key", Utils.UrlEncode(item.Path));
2024-06-04 01:48:04 +00:00
break;
case nameof(ETransport.grpc):
if (Utils.IsNotEmpty(item.Path))
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("authority", Utils.UrlEncode(item.RequestHost));
dicQuery.Add("serviceName", Utils.UrlEncode(item.Path));
if (item.HeaderType is Global.GrpcGunMode or Global.GrpcMultiMode)
2024-06-04 01:48:04 +00:00
{
dicQuery.Add("mode", Utils.UrlEncode(item.HeaderType));
2024-06-04 01:48:04 +00:00
}
}
break;
}
return 0;
}
protected static int ResolveStdTransport(NameValueCollection query, ref ProfileItem item)
{
item.Flow = query["flow"] ?? "";
item.StreamSecurity = query["security"] ?? "";
item.Sni = query["sni"] ?? "";
item.Alpn = Utils.UrlDecode(query["alpn"] ?? "");
item.Fingerprint = Utils.UrlDecode(query["fp"] ?? "");
item.PublicKey = Utils.UrlDecode(query["pbk"] ?? "");
item.ShortId = Utils.UrlDecode(query["sid"] ?? "");
item.SpiderX = Utils.UrlDecode(query["spx"] ?? "");
item.AllowInsecure = (query["allowInsecure"] ?? "") == "1" ? "true" : "";
item.Network = query["type"] ?? nameof(ETransport.tcp);
switch (item.Network)
2024-06-04 01:48:04 +00:00
{
case nameof(ETransport.tcp):
item.HeaderType = query["headerType"] ?? Global.None;
item.RequestHost = Utils.UrlDecode(query["host"] ?? "");
2024-06-04 01:48:04 +00:00
break;
case nameof(ETransport.kcp):
item.HeaderType = query["headerType"] ?? Global.None;
item.Path = Utils.UrlDecode(query["seed"] ?? "");
2024-06-04 01:48:04 +00:00
break;
case nameof(ETransport.ws):
case nameof(ETransport.httpupgrade):
item.RequestHost = Utils.UrlDecode(query["host"] ?? "");
item.Path = Utils.UrlDecode(query["path"] ?? "/");
break;
2024-11-13 11:48:44 +00:00
case nameof(ETransport.xhttp):
item.RequestHost = Utils.UrlDecode(query["host"] ?? "");
item.Path = Utils.UrlDecode(query["path"] ?? "/");
item.HeaderType = Utils.UrlDecode(query["mode"] ?? "");
item.Extra = Utils.UrlDecode(query["extra"] ?? "");
2024-06-04 01:48:04 +00:00
break;
case nameof(ETransport.http):
case nameof(ETransport.h2):
item.Network = nameof(ETransport.h2);
item.RequestHost = Utils.UrlDecode(query["host"] ?? "");
item.Path = Utils.UrlDecode(query["path"] ?? "/");
2024-06-04 01:48:04 +00:00
break;
case nameof(ETransport.quic):
item.HeaderType = query["headerType"] ?? Global.None;
item.RequestHost = query["quicSecurity"] ?? Global.None;
item.Path = Utils.UrlDecode(query["key"] ?? "");
2024-06-04 01:48:04 +00:00
break;
case nameof(ETransport.grpc):
item.RequestHost = Utils.UrlDecode(query["authority"] ?? "");
item.Path = Utils.UrlDecode(query["serviceName"] ?? "");
item.HeaderType = Utils.UrlDecode(query["mode"] ?? Global.GrpcGunMode);
2024-06-04 01:48:04 +00:00
break;
default:
break;
}
return 0;
}
2024-06-21 03:15:35 +00:00
protected static bool Contains(string str, params string[] s)
{
foreach (var item in s)
{
if (str.Contains(item, StringComparison.OrdinalIgnoreCase)) return true;
}
return false;
}
protected static string WriteAllText(string strData, string ext = "json")
{
2024-10-14 02:42:05 +00:00
var fileName = Utils.GetTempPath($"{Utils.GetGuid(false)}.{ext}");
2024-06-21 03:15:35 +00:00
File.WriteAllText(fileName, strData);
return fileName;
}
2024-10-15 07:17:05 +00:00
protected static string ToUri(EConfigType eConfigType, string address, object port, string userInfo, Dictionary<string, string>? dicQuery, string? remark)
{
var query = dicQuery != null
? ("?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()))
: string.Empty;
var url = $"{Utils.UrlEncode(userInfo)}@{GetIpv6(address)}:{port}";
return $"{Global.ProtocolShares[eConfigType]}{url}{query}{remark}";
}
2024-06-04 01:48:04 +00:00
}
}