H/3 and Quic AppContext switch (#55332)
authorMarie Píchová <11718369+ManickaP@users.noreply.github.com>
Wed, 14 Jul 2021 07:19:45 +0000 (09:19 +0200)
committerGitHub <noreply@github.com>
Wed, 14 Jul 2021 07:19:45 +0000 (09:19 +0200)
* Renamed AllowDraftHttp3 to AllowHttp3AndQuic app context switch

* Usage of AllowHttp3AndQuic switch in S.N.Quic and enabling it in tests

* Renamed AppContext switch to Http3Support

src/libraries/System.Net.Http/src/System/Net/Http/GlobalHttpSettings.cs
src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/HttpConnectionSettings.cs
src/libraries/System.Net.Http/tests/FunctionalTests/System.Net.Http.Functional.Tests.csproj
src/libraries/System.Net.Http/tests/StressTests/HttpStress/HttpStress.csproj
src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/MsQuic/Internal/MsQuicApi.cs
src/libraries/System.Net.Quic/tests/FunctionalTests/System.Net.Quic.Functional.Tests.csproj

index 7382f4ca0da13c59fd0d0306173c10b1062c4de8..664d296dcb6d19ba05fbd03af35dc8c34337ecba 100644 (file)
@@ -26,12 +26,12 @@ namespace System.Net.Http
                 "DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP2SUPPORT",
                 true);
 
-            // Default to allowing draft HTTP/3, but enable that to be overridden
-            // by an AppContext switch, or by an environment variable being set to false/0.
-            public static bool AllowDraftHttp3 { get; } = RuntimeSettingParser.QueryRuntimeSettingSwitch(
-                "System.Net.SocketsHttpHandler.Http3DraftSupport",
-                "DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3DRAFTSUPPORT",
-                true);
+            // Default to disable HTTP/3 (and by an extent QUIC), but enable that to be overridden
+            // by an AppContext switch, or by an environment variable being set to true/1.
+            public static bool AllowHttp3 { get; } = RuntimeSettingParser.QueryRuntimeSettingSwitch(
+                "System.Net.SocketsHttpHandler.Http3Support",
+                "DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT",
+                false);
 
             // Switch to disable the HTTP/2 dynamic window scaling algorithm. Enabled by default.
             public static bool DisableDynamicHttp2WindowSizing { get; } = RuntimeSettingParser.QueryRuntimeSettingSwitch(
index a24a6403b299d1dd66024f7f74c4bd44600d0989..410acc16b69ad4d665fc9d0c75d838f2564b0fe1 100644 (file)
@@ -70,7 +70,7 @@ namespace System.Net.Http
         public HttpConnectionSettings()
         {
             bool allowHttp2 = GlobalHttpSettings.SocketsHttpHandler.AllowHttp2;
-            bool allowHttp3 = GlobalHttpSettings.SocketsHttpHandler.AllowDraftHttp3;
+            bool allowHttp3 = GlobalHttpSettings.SocketsHttpHandler.AllowHttp3;
             _maxHttpVersion =
                 allowHttp3 && allowHttp2 ? HttpVersion.Version30 :
                 allowHttp2 ? HttpVersion.Version20 :
index b3413cbef30533be3d8820eeb230b70637d0e663..667b35e9a8afeb8209987a8ba8e6945a2fef7738 100644 (file)
@@ -9,6 +9,10 @@
     <TargetFrameworks>$(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-Linux;$(NetCoreAppCurrent)-Browser;$(NetCoreAppCurrent)-OSX</TargetFrameworks>
   </PropertyGroup>
 
+  <ItemGroup>
+    <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
+  </ItemGroup>
+
   <PropertyGroup Condition="'$(TargetOS)' == 'Browser'">
     <Scenario>WasmTestOnBrowser</Scenario>
     <TestArchiveTestsRoot>$(TestArchiveRoot)browseronly/</TestArchiveTestsRoot>
index db333cc634f6caf1183025fe0c72426a8ffa26be..80b4aa21b108ba5e3195f8818f4f90d1f1ec5ae3 100644 (file)
@@ -7,6 +7,10 @@
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
+  <ItemGroup>
+    <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
+  </ItemGroup>
+
   <ItemGroup>
     <PackageReference Include="Serilog.AspNetCore" Version="3.4.0" />
     <PackageReference Include="Serilog.Extensions.Logging.File" Version="2.0.0" />
index cba34f6dbbaff734a7ca050e156773bb50af27ef..b691d3c5c14da1a542213e459299cd78d78ed9cc 100644 (file)
@@ -125,10 +125,18 @@ namespace System.Net.Quic.Implementations.MsQuic.Internal
 
         static MsQuicApi()
         {
-            if (OperatingSystem.IsWindows() && !IsWindowsVersionSupported())
+            if (!IsHttp3Enabled())
             {
-                IsQuicSupported = false;
+                if (NetEventSource.Log.IsEnabled())
+                {
+                    NetEventSource.Info(null, $"HTTP/3 and QUIC is not enabled, see 'System.Net.SocketsHttpHandler.Http3Support' AppContext switch.");
+                }
 
+                return;
+            }
+
+            if (OperatingSystem.IsWindows() && !IsWindowsVersionSupported())
+            {
                 if (NetEventSource.Log.IsEnabled())
                 {
                     NetEventSource.Info(null, $"Current Windows version ({Environment.OSVersion}) is not supported by QUIC. Minimal supported version is {MinWindowsVersion}");
@@ -163,6 +171,34 @@ namespace System.Net.Quic.Implementations.MsQuic.Internal
             }
         }
 
+        // Note that this is copy-pasted from S.N.Http just to hide S.N.Quic behind the same AppContext switch
+        // since this library is considered "private" for 6.0.
+        // We should get rid of this once S.N.Quic API surface is officially exposed.
+        private static bool IsHttp3Enabled()
+        {
+            bool value;
+
+            // First check for the AppContext switch, giving it priority over the environment variable.
+            if (AppContext.TryGetSwitch("System.Net.SocketsHttpHandler.Http3Support", out value))
+            {
+                return value;
+            }
+
+            // AppContext switch wasn't used. Check the environment variable.
+            string? envVar = Environment.GetEnvironmentVariable("DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT");
+
+            if (bool.TryParse(envVar, out value))
+            {
+                return value;
+            }
+            else if (uint.TryParse(envVar, out uint intVal))
+            {
+                return intVal != 0;
+            }
+
+            return false;
+        }
+
         private static bool IsWindowsVersionSupported() => OperatingSystem.IsWindowsVersionAtLeast(MinWindowsVersion.Major,
             MinWindowsVersion.Minor, MinWindowsVersion.Build, MinWindowsVersion.Revision);
 
index 2a17894a5555a77a48b096f42c4371e8f4ce82db..583b2b6c4861eee3be64644c924261656a0cdcd2 100644 (file)
@@ -4,6 +4,9 @@
     <IncludeRemoteExecutor>true</IncludeRemoteExecutor>
     <TargetFrameworks>$(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-Unix</TargetFrameworks>
   </PropertyGroup>
+  <ItemGroup>
+    <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
+  </ItemGroup>
   <ItemGroup>
     <Compile Include="*.cs" />
   </ItemGroup>