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;
}
}