diff --git a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Unix.cs b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Unix.cs index 916b5cb07cd60a..f636d34b7f6b6d 100644 --- a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Unix.cs +++ b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Unix.cs @@ -7,12 +7,8 @@ namespace System.Net { - internal static class SocketProtocolSupportPal + internal static partial class SocketProtocolSupportPal { - public static bool OSSupportsIPv6 { get; } = IsSupported(AddressFamily.InterNetworkV6); - public static bool OSSupportsIPv4 { get; } = IsSupported(AddressFamily.InterNetwork); - public static bool OSSupportsUnixDomainSockets { get; } = IsSupported(AddressFamily.Unix); - private static unsafe bool IsSupported(AddressFamily af) { IntPtr invalid = (IntPtr)(-1); diff --git a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Windows.cs b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Windows.cs index de0465a51c6c7e..50e7db176e2f14 100644 --- a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Windows.cs +++ b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Windows.cs @@ -9,12 +9,8 @@ namespace System.Net { - internal static class SocketProtocolSupportPal + internal static partial class SocketProtocolSupportPal { - public static bool OSSupportsIPv6 { get; } = IsSupported(AddressFamily.InterNetworkV6); - public static bool OSSupportsIPv4 { get; } = IsSupported(AddressFamily.InterNetwork); - public static bool OSSupportsUnixDomainSockets { get; } = IsSupported(AddressFamily.Unix); - private static bool IsSupported(AddressFamily af) { Interop.Winsock.EnsureInitialized(); diff --git a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.cs b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.cs new file mode 100644 index 00000000000000..c540cbe3e171a3 --- /dev/null +++ b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Net.Sockets; + +namespace System.Net +{ + internal static partial class SocketProtocolSupportPal + { + public static bool OSSupportsIPv6 { get; } = !IsIPV6Disabled && IsSupported(AddressFamily.InterNetworkV6); + public static bool OSSupportsIPv4 { get; } = IsSupported(AddressFamily.InterNetwork); + public static bool OSSupportsUnixDomainSockets { get; } = IsSupported(AddressFamily.Unix); + + private static bool IsIPV6Disabled + { + get + { + const string DisableIpv6AppContextSettingName = "System.Net.Sockets.DisableIPv6"; + const string DisableIpv6EnvironmentVariableName = "DOTNET_SYSTEM_NET_SOCKETS_DISABLEIPV6"; + + if (AppContext.TryGetSwitch(DisableIpv6AppContextSettingName, out bool disableIpV6)) + { + return disableIpV6; + } + + string? envVar = Environment.GetEnvironmentVariable(DisableIpv6EnvironmentVariableName); + return envVar != null && (envVar.Equals("true", StringComparison.OrdinalIgnoreCase) || envVar.Equals("1")); + } + } + } +} diff --git a/src/libraries/System.Net.Sockets/src/System.Net.Sockets.csproj b/src/libraries/System.Net.Sockets/src/System.Net.Sockets.csproj index c52df4c00e9184..b51a0f15c9c215 100644 --- a/src/libraries/System.Net.Sockets/src/System.Net.Sockets.csproj +++ b/src/libraries/System.Net.Sockets/src/System.Net.Sockets.csproj @@ -1,4 +1,4 @@ - + true $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-Unix;$(NetCoreAppCurrent)-Browser @@ -72,6 +72,8 @@ Link="Common\System\Net\RangeValidationHelpers.cs" /> + + Link="Common\System\Net\SocketProtocolSupportPal.Windows.cs" /> @@ -208,7 +210,7 @@ + Link="Common\System\Net\SocketProtocolSupportPal.Unix.cs" /> + { + if (bool.Parse(appContextOrEnvironmentVariableInner)) + { + AppContext.SetSwitch("System.Net.Sockets.DisableIPv6", true); + } + + Assert.False(Socket.OSSupportsIPv6); + + using Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp); + Assert.Equal(AddressFamily.InterNetwork, socket.AddressFamily); + }, appContextOrEnvironmentVariable.ToString(), options).Dispose(); + } } }