diff --git a/v2rayN/ServiceLib/Global.cs b/v2rayN/ServiceLib/Global.cs index 88c0376a..ea169bfb 100644 --- a/v2rayN/ServiceLib/Global.cs +++ b/v2rayN/ServiceLib/Global.cs @@ -45,6 +45,8 @@ public class Global public const string DefaultNetwork = "raw"; public const string RawHeaderHttp = "http"; public const string None = "none"; + public const string RawNetworkAlias = "tcp"; + public const string DefaultXhttpMode = "auto"; public const string ProxyTag = "proxy"; public const string DirectTag = "direct"; public const string BlockTag = "block"; diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index f430cfe5..82b4241a 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -1140,7 +1140,6 @@ public static class ConfigHandler && AreEqual(oProtocolExtra.VmessSecurity, nProtocolExtra.VmessSecurity) && AreEqual(o.Network, n.Network) && AreEqual(oTransport.RawHeaderType, nTransport.RawHeaderType) - && AreEqual(oTransport.RawHost, nTransport.RawHost) && AreEqual(oTransport.Host, nTransport.Host) && AreEqual(oTransport.Path, nTransport.Path) && AreEqual(oTransport.XhttpMode, nTransport.XhttpMode) diff --git a/v2rayN/ServiceLib/Handler/Fmt/BaseFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/BaseFmt.cs index 6a0c43d6..3f07548f 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/BaseFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/BaseFmt.cs @@ -5,6 +5,7 @@ namespace ServiceLib.Handler.Fmt; public class BaseFmt { private static readonly string[] _allowInsecureArray = new[] { "insecure", "allowInsecure", "allow_insecure" }; + private static string UrlEncodeSafe(string? value) => Utils.UrlEncode(value ?? string.Empty); protected static string GetIpv6(string address) { @@ -95,15 +96,20 @@ public class BaseFmt network = nameof(ETransport.raw); } - dicQuery.Add("type", network); + //dicQuery.Add("type", network); + dicQuery.Add("type", network == nameof(ETransport.raw) ? Global.RawNetworkAlias : network); switch (network) { case nameof(ETransport.raw): dicQuery.Add("headerType", transport.RawHeaderType.IsNotEmpty() ? transport.RawHeaderType : Global.None); - if (transport.RawHost.IsNotEmpty()) + if (transport.Host.IsNotEmpty()) { - dicQuery.Add("host", Utils.UrlEncode(transport.RawHost)); + dicQuery.Add("host", UrlEncodeSafe(transport.Host)); + } + if (transport.Path.IsNotEmpty()) + { + dicQuery.Add("path", UrlEncodeSafe(transport.Path)); } break; @@ -111,44 +117,34 @@ public class BaseFmt dicQuery.Add("headerType", transport.KcpHeaderType.IsNotEmpty() ? transport.KcpHeaderType : Global.None); if (transport.KcpSeed.IsNotEmpty()) { - dicQuery.Add("seed", Utils.UrlEncode(transport.KcpSeed)); + dicQuery.Add("seed", UrlEncodeSafe(transport.KcpSeed)); } break; case nameof(ETransport.ws): - if (transport.Host.IsNotEmpty()) - { - dicQuery.Add("host", Utils.UrlEncode(transport.Host)); - } - if (transport.Path.IsNotEmpty()) - { - dicQuery.Add("path", Utils.UrlEncode(transport.Path)); - } - break; - case nameof(ETransport.httpupgrade): if (transport.Host.IsNotEmpty()) { - dicQuery.Add("host", Utils.UrlEncode(transport.Host)); + dicQuery.Add("host", UrlEncodeSafe(transport.Host)); } if (transport.Path.IsNotEmpty()) { - dicQuery.Add("path", Utils.UrlEncode(transport.Path)); + dicQuery.Add("path", UrlEncodeSafe(transport.Path)); } break; case nameof(ETransport.xhttp): if (transport.Host.IsNotEmpty()) { - dicQuery.Add("host", Utils.UrlEncode(transport.Host)); + dicQuery.Add("host", UrlEncodeSafe(transport.Host)); } if (transport.Path.IsNotEmpty()) { - dicQuery.Add("path", Utils.UrlEncode(transport.Path)); + dicQuery.Add("path", UrlEncodeSafe(transport.Path)); } if (transport.XhttpMode.IsNotEmpty() && Global.XhttpMode.Contains(transport.XhttpMode)) { - dicQuery.Add("mode", Utils.UrlEncode(transport.XhttpMode)); + dicQuery.Add("mode", UrlEncodeSafe(transport.XhttpMode)); } if (transport.XhttpExtra.IsNotEmpty()) { @@ -161,18 +157,18 @@ public class BaseFmt Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }) : transport.XhttpExtra; - dicQuery.Add("extra", Utils.UrlEncode(extra)); + dicQuery.Add("extra", UrlEncodeSafe(extra)); } break; case nameof(ETransport.grpc): if (transport.GrpcServiceName.IsNotEmpty()) { - dicQuery.Add("authority", Utils.UrlEncode(transport.GrpcAuthority)); - dicQuery.Add("serviceName", Utils.UrlEncode(transport.GrpcServiceName)); + dicQuery.Add("authority", UrlEncodeSafe(transport.GrpcAuthority)); + dicQuery.Add("serviceName", UrlEncodeSafe(transport.GrpcServiceName)); if (transport.GrpcMode is Global.GrpcGunMode or Global.GrpcMultiMode) { - dicQuery.Add("mode", Utils.UrlEncode(transport.GrpcMode)); + dicQuery.Add("mode", UrlEncodeSafe(transport.GrpcMode)); } } break; @@ -260,6 +256,10 @@ public class BaseFmt } var net = GetQueryValue(query, "type", nameof(ETransport.raw)); + if (net == Global.RawNetworkAlias) + { + net = nameof(ETransport.raw); + } if (!Global.Networks.Contains(net)) { net = nameof(ETransport.raw); @@ -272,7 +272,8 @@ public class BaseFmt transport = transport with { RawHeaderType = GetQueryValue(query, "headerType", Global.None), - RawHost = GetQueryDecoded(query, "host"), + Host = GetQueryDecoded(query, "host"), + Path = GetQueryDecoded(query, "path"), }; break; @@ -286,13 +287,6 @@ public class BaseFmt break; case nameof(ETransport.ws): - transport = transport with - { - Host = GetQueryDecoded(query, "host"), - Path = GetQueryDecoded(query, "path", "/"), - }; - break; - case nameof(ETransport.httpupgrade): transport = transport with { diff --git a/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs index fc60102c..ab805002 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs @@ -51,7 +51,7 @@ public class ShadowsocksFmt : BaseFmt if (item.Network == nameof(ETransport.raw) && transport.RawHeaderType == Global.RawHeaderHttp) { plugin = "obfs-local"; - pluginArgs = $"obfs=http;obfs-host={transport.RawHost};"; + pluginArgs = $"obfs=http;obfs-host={transport.Host};"; } else { @@ -213,7 +213,7 @@ public class ShadowsocksFmt : BaseFmt item.SetTransportExtra(item.GetTransportExtra() with { RawHeaderType = Global.RawHeaderHttp, - RawHost = obfsHost, + Host = obfsHost, }); } } diff --git a/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs index e4f68a51..eeb709ad 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs @@ -34,7 +34,7 @@ public class VmessFmt : BaseFmt id = item.Password, aid = int.TryParse(item.GetProtocolExtra()?.AlterId, out var result) ? result : 0, scy = item.GetProtocolExtra().VmessSecurity ?? "", - net = item.Network, + net = item.GetNetwork() == nameof(ETransport.raw) ? Global.RawNetworkAlias : item.Network, type = item.GetNetwork() switch { nameof(ETransport.raw) => item.GetTransportExtra().RawHeaderType, @@ -45,7 +45,7 @@ public class VmessFmt : BaseFmt }, host = item.GetNetwork() switch { - nameof(ETransport.raw) => item.GetTransportExtra().RawHost, + nameof(ETransport.raw) => item.GetTransportExtra().Host, nameof(ETransport.ws) => item.GetTransportExtra().Host, nameof(ETransport.httpupgrade) => item.GetTransportExtra().Host, nameof(ETransport.xhttp) => item.GetTransportExtra().Host, @@ -54,6 +54,7 @@ public class VmessFmt : BaseFmt }, path = item.GetNetwork() switch { + nameof(ETransport.raw) => item.GetTransportExtra().Path, nameof(ETransport.kcp) => item.GetTransportExtra().KcpSeed, nameof(ETransport.ws) => item.GetTransportExtra().Path, nameof(ETransport.httpupgrade) => item.GetTransportExtra().Path, @@ -111,7 +112,7 @@ public class VmessFmt : BaseFmt }); if (vmessQRCode.net.IsNotEmpty()) { - item.Network = vmessQRCode.net; + item.Network = vmessQRCode.net == Global.RawNetworkAlias ? nameof(ETransport.raw) : vmessQRCode.net; } if (vmessQRCode.type.IsNotEmpty()) { @@ -126,7 +127,7 @@ public class VmessFmt : BaseFmt } transport = item.GetNetwork() switch { - nameof(ETransport.raw) => transport with { RawHost = Utils.ToString(vmessQRCode.host) }, + nameof(ETransport.raw) => transport with { Host = Utils.ToString(vmessQRCode.host), Path = Utils.ToString(vmessQRCode.path) }, nameof(ETransport.kcp) => transport with { KcpSeed = Utils.ToString(vmessQRCode.path) }, nameof(ETransport.ws) => transport with { Host = Utils.ToString(vmessQRCode.host), Path = Utils.ToString(vmessQRCode.path) }, nameof(ETransport.httpupgrade) => transport with { Host = Utils.ToString(vmessQRCode.host), Path = Utils.ToString(vmessQRCode.path) }, @@ -164,7 +165,7 @@ public class VmessFmt : BaseFmt item.SetProtocolExtra(new ProtocolExtraItem { - VmessSecurity = "auto", + VmessSecurity = Global.DefaultSecurity, }); var query = Utils.ParseQueryString(url.Query); diff --git a/v2rayN/ServiceLib/Manager/AppManager.cs b/v2rayN/ServiceLib/Manager/AppManager.cs index 67daa806..59c8cc3e 100644 --- a/v2rayN/ServiceLib/Manager/AppManager.cs +++ b/v2rayN/ServiceLib/Manager/AppManager.cs @@ -362,7 +362,7 @@ public sealed class AppManager { try { - if (item.Network == "tcp") + if (item.Network == Global.RawNetworkAlias) { item.Network = nameof(ETransport.raw); } @@ -376,7 +376,8 @@ public sealed class AppManager transport = transport with { RawHeaderType = item.HeaderType.NullIfEmpty(), - RawHost = item.RequestHost.NullIfEmpty(), + Host = item.RequestHost.NullIfEmpty(), + Path = item.Path.NullIfEmpty(), }; break; @@ -421,7 +422,7 @@ public sealed class AppManager transport = transport with { RawHeaderType = item.HeaderType.NullIfEmpty(), - RawHost = item.RequestHost.NullIfEmpty(), + Host = item.RequestHost.NullIfEmpty(), }; break; } diff --git a/v2rayN/ServiceLib/Models/ProfileItem.cs b/v2rayN/ServiceLib/Models/ProfileItem.cs index 1164ce45..fa1945ca 100644 --- a/v2rayN/ServiceLib/Models/ProfileItem.cs +++ b/v2rayN/ServiceLib/Models/ProfileItem.cs @@ -169,7 +169,7 @@ public class ProfileItem public string Network { get; set; } [Obsolete("Use TransportExtra.RawHeaderType/XhttpMode/GrpcMode/KcpHeaderType instead.")] public string HeaderType { get; set; } - [Obsolete("Use TransportExtra.RawHost/Host/GrpcAuthority instead.")] + [Obsolete("Use TransportExtra.Host/GrpcAuthority instead.")] public string RequestHost { get; set; } [Obsolete("Use TransportExtra.Path/GrpcServiceName/KcpSeed instead.")] public string Path { get; set; } diff --git a/v2rayN/ServiceLib/Models/TransportExtra.cs b/v2rayN/ServiceLib/Models/TransportExtra.cs index 105b20d9..b382135e 100644 --- a/v2rayN/ServiceLib/Models/TransportExtra.cs +++ b/v2rayN/ServiceLib/Models/TransportExtra.cs @@ -3,7 +3,6 @@ namespace ServiceLib.Models; public record TransportExtra { public string? RawHeaderType { get; init; } - public string? RawHost { get; init; } public string? Host { get; init; } public string? Path { get; init; } diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs index e9a8a151..c53e3272 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs @@ -119,7 +119,7 @@ public partial class CoreConfigSingboxService if (network == nameof(ETransport.raw) && transportExtra.RawHeaderType == Global.RawHeaderHttp) { outbound.plugin = "obfs-local"; - outbound.plugin_opts = $"obfs=http;obfs-host={transportExtra.RawHost};"; + outbound.plugin_opts = $"obfs=http;obfs-host={transportExtra.Host};"; } else { @@ -383,7 +383,7 @@ public partial class CoreConfigSingboxService { var host = _node.GetNetwork() switch { - nameof(ETransport.raw) => _node.GetTransportExtra().RawHost, + nameof(ETransport.raw) => _node.GetTransportExtra().Host, nameof(ETransport.ws) => _node.GetTransportExtra().Host, nameof(ETransport.httpupgrade) => _node.GetTransportExtra().Host, nameof(ETransport.xhttp) => _node.GetTransportExtra().Host, @@ -453,7 +453,8 @@ public partial class CoreConfigSingboxService if (transportExtra.RawHeaderType == Global.RawHeaderHttp) { transport.type = nameof(ETransport.http); - transport.host = transportExtra.RawHost.IsNullOrEmpty() ? null : Utils.String2List(transportExtra.RawHost); + transport.host = transportExtra.Host.IsNullOrEmpty() ? null : Utils.String2List(transportExtra.Host); + transport.path = transportExtra.Path.NullIfEmpty(); } break; diff --git a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs index e9a91416..5cea3eac 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs @@ -357,7 +357,8 @@ public partial class CoreConfigV2rayService switch (network) { case nameof(ETransport.raw): - host = transport.RawHost?.TrimEx() ?? string.Empty; + host = transport.Host?.TrimEx() ?? string.Empty; + path = transport.Path?.TrimEx() ?? string.Empty; headerType = transport.RawHeaderType?.TrimEx() ?? string.Empty; break; diff --git a/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs b/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs index 27f737d5..c4ea2fc0 100644 --- a/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs @@ -76,9 +76,6 @@ public class AddServerViewModel : MyReactiveObject [Reactive] public string RawHeaderType { get; set; } - [Reactive] - public string RawHost { get; set; } - [Reactive] public string Host { get; set; } @@ -141,7 +138,7 @@ public class AddServerViewModel : MyReactiveObject { get => SelectedSource.GetNetwork() switch { - nameof(ETransport.raw) => RawHost, + nameof(ETransport.raw) => Host, nameof(ETransport.ws) => Host, nameof(ETransport.httpupgrade) => Host, nameof(ETransport.xhttp) => Host, @@ -153,7 +150,7 @@ public class AddServerViewModel : MyReactiveObject switch (SelectedSource.GetNetwork()) { case nameof(ETransport.raw): - RawHost = value; + Host = value; break; case nameof(ETransport.ws): Host = value; @@ -298,10 +295,9 @@ public class AddServerViewModel : MyReactiveObject NaiveQuic = protocolExtra?.NaiveQuic ?? false; RawHeaderType = transport.RawHeaderType ?? Global.None; - RawHost = transport.RawHost ?? string.Empty; Host = transport.Host ?? string.Empty; Path = transport.Path ?? string.Empty; - XhttpMode = transport.XhttpMode ?? string.Empty; + XhttpMode = transport.XhttpMode ?? Global.DefaultXhttpMode; XhttpExtra = transport.XhttpExtra ?? string.Empty; GrpcAuthority = transport.GrpcAuthority ?? string.Empty; GrpcServiceName = transport.GrpcServiceName ?? string.Empty; @@ -363,7 +359,6 @@ public class AddServerViewModel : MyReactiveObject var transport = new TransportExtra { RawHeaderType = RawHeaderType.NullIfEmpty(), - RawHost = RawHost.NullIfEmpty(), Host = Host.NullIfEmpty(), Path = Path.NullIfEmpty(), XhttpMode = XhttpMode.NullIfEmpty(), @@ -497,7 +492,7 @@ public class AddServerViewModel : MyReactiveObject { return SelectedSource.GetNetwork() switch { - nameof(ETransport.raw) => RawHost, + nameof(ETransport.raw) => Host, nameof(ETransport.ws) => Host, nameof(ETransport.httpupgrade) => Host, nameof(ETransport.xhttp) => Host, diff --git a/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml b/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml index fe8d513f..4ecb0a88 100644 --- a/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml @@ -718,33 +718,54 @@ - - - + + + + + - + ColumnDefinitions="300,Auto" + IsVisible="False" + RowDefinitions="Auto,Auto"> + + + + + Loaded += Window_Loaded; btnCancel.Click += (s, e) => Close(); cmbNetwork.SelectionChanged += CmbNetwork_SelectionChanged; + cmbHeaderTypeRaw.SelectionChanged += CmbHeaderTypeRaw_SelectionChanged; cmbStreamSecurity.SelectionChanged += CmbStreamSecurity_SelectionChanged; btnGUID.Click += btnGUID_Click; btnGUID5.Click += btnGUID_Click; @@ -24,6 +25,16 @@ public partial class AddServerWindow : WindowBase cmbCoreType.ItemsSource = Global.CoreTypes.AppendEmpty(); cmbNetwork.ItemsSource = Global.Networks; + + cmbHeaderTypeRaw.ItemsSource = new List { Global.None, Global.RawHeaderHttp }; + + var kcpHeaderTypes = new List { Global.None }; + kcpHeaderTypes.AddRange(Global.KcpHeaderTypes); + cmbHeaderTypeKcp.ItemsSource = kcpHeaderTypes; + + cmbHeaderTypeXhttp.ItemsSource = Global.XhttpMode; + cmbHeaderTypeGrpc.ItemsSource = new List { Global.GrpcGunMode, Global.GrpcMultiMode }; + cmbFingerprint.ItemsSource = Global.Fingerprints; cmbFingerprint2.ItemsSource = Global.Fingerprints; cmbAllowInsecure.ItemsSource = Global.AllowInsecure; @@ -202,7 +213,8 @@ public partial class AddServerWindow : WindowBase } this.Bind(ViewModel, vm => vm.SelectedSource.Network, v => v.cmbNetwork.SelectedValue).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.RawHeaderType, v => v.cmbHeaderTypeRaw.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.RawHost, v => v.txtRequestHostRaw.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.Host, v => v.txtRequestHostRaw.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.Path, v => v.txtPathRaw.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.KcpHeaderType, v => v.cmbHeaderTypeKcp.SelectedValue).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.KcpSeed, v => v.txtKcpSeed.Text).DisposeWith(disposables); @@ -269,8 +281,12 @@ public partial class AddServerWindow : WindowBase private void CmbNetwork_SelectionChanged(object? sender, SelectionChangedEventArgs e) { - SetHeaderType(); - SetTips(); + SetTransportGridVisibility(); + } + + private void CmbHeaderTypeRaw_SelectionChanged(object? sender, SelectionChangedEventArgs e) + { + SetRawHttpFieldsVisibility(); } private void CmbStreamSecurity_SelectionChanged(object? sender, SelectionChangedEventArgs e) @@ -299,25 +315,6 @@ public partial class AddServerWindow : WindowBase txtId5.Text = Utils.GetGuid(); } - private void SetHeaderType() - { - cmbHeaderTypeRaw.ItemsSource = new List { Global.None, Global.RawHeaderHttp }; - - var kcpHeaderTypes = new List { Global.None }; - kcpHeaderTypes.AddRange(Global.KcpHeaderTypes); - cmbHeaderTypeKcp.ItemsSource = kcpHeaderTypes; - - cmbHeaderTypeXhttp.ItemsSource = Global.XhttpMode; - cmbHeaderTypeGrpc.ItemsSource = new List { Global.GrpcGunMode, Global.GrpcMultiMode }; - - SetTransportGridVisibility(); - } - - private void SetTips() - { - SetTransportGridVisibility(); - } - private void SetTransportGridVisibility() { var network = cmbNetwork.SelectedItem?.ToString(); @@ -357,5 +354,21 @@ public partial class AddServerWindow : WindowBase gridTransportRaw.IsVisible = true; break; } + + SetRawHttpFieldsVisibility(); + } + + private void SetRawHttpFieldsVisibility() + { + var network = cmbNetwork.SelectedItem?.ToString(); + if (network.IsNullOrEmpty()) + { + network = Global.DefaultNetwork; + } + + var rawHeaderType = cmbHeaderTypeRaw.SelectedItem?.ToString(); + var showRawHttpFields = network == nameof(ETransport.raw) + && rawHeaderType == Global.RawHeaderHttp; + gridTransportRawHttp.IsVisible = showRawHttpFields; } } diff --git a/v2rayN/v2rayN/Views/AddServerWindow.xaml b/v2rayN/v2rayN/Views/AddServerWindow.xaml index 5ca1c67a..903fad9a 100644 --- a/v2rayN/v2rayN/Views/AddServerWindow.xaml +++ b/v2rayN/v2rayN/Views/AddServerWindow.xaml @@ -943,42 +943,73 @@ - - - - - - - + + + + + + + + + - + Visibility="Collapsed"> + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs b/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs index 30f623cf..46f62a70 100644 --- a/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs @@ -11,6 +11,7 @@ public partial class AddServerWindow Owner = Application.Current.MainWindow; Loaded += Window_Loaded; cmbNetwork.SelectionChanged += CmbNetwork_SelectionChanged; + cmbHeaderTypeRaw.SelectionChanged += CmbHeaderTypeRaw_SelectionChanged; cmbStreamSecurity.SelectionChanged += CmbStreamSecurity_SelectionChanged; btnGUID.Click += btnGUID_Click; btnGUID5.Click += btnGUID_Click; @@ -23,6 +24,16 @@ public partial class AddServerWindow { ViewModel.SelectedSource.Network = Global.DefaultNetwork; } + + cmbHeaderTypeRaw.ItemsSource = new List { Global.None, Global.RawHeaderHttp }; + + var kcpHeaderTypes = new List { Global.None }; + kcpHeaderTypes.AddRange(Global.KcpHeaderTypes); + cmbHeaderTypeKcp.ItemsSource = kcpHeaderTypes; + + cmbHeaderTypeXhttp.ItemsSource = Global.XhttpMode; + cmbHeaderTypeGrpc.ItemsSource = new List { Global.GrpcGunMode, Global.GrpcMultiMode }; + cmbFingerprint.ItemsSource = Global.Fingerprints; cmbFingerprint2.ItemsSource = Global.Fingerprints; cmbAllowInsecure.ItemsSource = Global.AllowInsecure; @@ -200,7 +211,8 @@ public partial class AddServerWindow } this.Bind(ViewModel, vm => vm.SelectedSource.Network, v => v.cmbNetwork.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.RawHeaderType, v => v.cmbHeaderTypeRaw.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.RawHost, v => v.txtRequestHostRaw.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.Host, v => v.txtRequestHostRaw.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.Path, v => v.txtPathRaw.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.KcpHeaderType, v => v.cmbHeaderTypeKcp.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.KcpSeed, v => v.txtKcpSeed.Text).DisposeWith(disposables); @@ -269,8 +281,12 @@ public partial class AddServerWindow private void CmbNetwork_SelectionChanged(object sender, SelectionChangedEventArgs e) { - SetHeaderType(); - SetTips(); + SetTransportGridVisibility(); + } + + private void CmbHeaderTypeRaw_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + SetRawHttpFieldsVisibility(); } private void CmbStreamSecurity_SelectionChanged(object sender, SelectionChangedEventArgs e) @@ -299,25 +315,6 @@ public partial class AddServerWindow txtId5.Text = Utils.GetGuid(); } - private void SetHeaderType() - { - cmbHeaderTypeRaw.ItemsSource = new List { Global.None, Global.RawHeaderHttp }; - - var kcpHeaderTypes = new List { Global.None }; - kcpHeaderTypes.AddRange(Global.KcpHeaderTypes); - cmbHeaderTypeKcp.ItemsSource = kcpHeaderTypes; - - cmbHeaderTypeXhttp.ItemsSource = Global.XhttpMode; - cmbHeaderTypeGrpc.ItemsSource = new List { Global.GrpcGunMode, Global.GrpcMultiMode }; - - SetTransportGridVisibility(); - } - - private void SetTips() - { - SetTransportGridVisibility(); - } - private void SetTransportGridVisibility() { var network = cmbNetwork.SelectedItem?.ToString(); @@ -357,5 +354,23 @@ public partial class AddServerWindow gridTransportRaw.Visibility = Visibility.Visible; break; } + + SetRawHttpFieldsVisibility(); + } + + private void SetRawHttpFieldsVisibility() + { + var network = cmbNetwork.SelectedItem?.ToString(); + if (network.IsNullOrEmpty()) + { + network = Global.DefaultNetwork; + } + + var rawHeaderType = cmbHeaderTypeRaw.SelectedItem?.ToString(); + var showRawHttpFields = network == nameof(ETransport.raw) + && rawHeaderType == Global.RawHeaderHttp; + gridTransportRawHttp.Visibility = showRawHttpFields + ? Visibility.Visible + : Visibility.Collapsed; } }