public IEnumerable <Server> ParseUri(string text) { var data = new VMessServer(); string s; try { s = ShareLink.URLSafeBase64Decode(text.Substring(8)); } catch { return(V2rayUtils.ParseVUri(text)); } V2rayNJObject vmess = JsonSerializer.Deserialize <V2rayNJObject>(s, new JsonSerializerOptions { NumberHandling = JsonNumberHandling.WriteAsString | JsonNumberHandling.AllowReadingFromString }) !; data.Remark = vmess.ps; data.Hostname = vmess.add; data.EncryptMethod = vmess.scy; data.Port = vmess.port; data.UserID = vmess.id; data.AlterID = vmess.aid; data.TransferProtocol = vmess.net; data.FakeType = vmess.type; data.ServerName = vmess.sni; if (data.TransferProtocol == "quic") { data.QUICSecure = vmess.host; data.QUICSecret = vmess.path; } else { data.Host = vmess.host; data.Path = vmess.path; } data.TLSSecureType = vmess.tls; return(new[] { data }); }
private static StreamSettings boundStreamSettings(VMessServer server) { // https://xtls.github.io/config/transports var streamSettings = new StreamSettings { network = server.TransferProtocol, security = server.TLSSecureType }; if (server.TLSSecureType != "none") { var tlsSettings = new TlsSettings { allowInsecure = Global.Settings.V2RayConfig.AllowInsecure, serverName = server.ServerName.ValueOrDefault() ?? server.Host.SplitOrDefault()?[0] }; switch (server.TLSSecureType) { case "tls": streamSettings.tlsSettings = tlsSettings; break; case "xtls": streamSettings.xtlsSettings = tlsSettings; break; } } switch (server.TransferProtocol) { case "tcp": streamSettings.tcpSettings = new TcpSettings { header = new { type = server.FakeType, request = server.FakeType switch { "none" => null, "http" => new { path = server.Path.SplitOrDefault(), headers = new { Host = server.Host.SplitOrDefault() } }, _ => throw new MessageException($"Invalid tcp type {server.FakeType}") } } }; break; case "ws": streamSettings.wsSettings = new WsSettings { path = server.Path.ValueOrDefault(), headers = new { Host = server.Host.ValueOrDefault() } }; break; case "kcp": streamSettings.kcpSettings = new KcpSettings { mtu = Global.Settings.V2RayConfig.KcpConfig.mtu, tti = Global.Settings.V2RayConfig.KcpConfig.tti, uplinkCapacity = Global.Settings.V2RayConfig.KcpConfig.uplinkCapacity, downlinkCapacity = Global.Settings.V2RayConfig.KcpConfig.downlinkCapacity, congestion = Global.Settings.V2RayConfig.KcpConfig.congestion, readBufferSize = Global.Settings.V2RayConfig.KcpConfig.readBufferSize, writeBufferSize = Global.Settings.V2RayConfig.KcpConfig.writeBufferSize, header = new { type = server.FakeType }, seed = server.Path.ValueOrDefault() }; break; case "h2": streamSettings.httpSettings = new HttpSettings { host = server.Host.SplitOrDefault(), path = server.Path.ValueOrDefault() }; break; case "quic": streamSettings.quicSettings = new QuicSettings { security = server.QUICSecure, key = server.QUICSecret, header = new { type = server.FakeType } }; break; case "grpc": streamSettings.grpcSettings = new GrpcSettings { serviceName = server.Path, multiMode = server.FakeType == "multi" }; break; default: throw new MessageException($"transfer protocol \"{server.TransferProtocol}\" not implemented yet"); } return(streamSettings); }