From 259652fbf7596dbaeacab7a4d621718ffe158722 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Thu, 9 Apr 2026 02:03:03 +0000 Subject: [PATCH 01/13] Backflow from https://github.com/dotnet/dotnet / 0cf6b19 build 309569 [[ commit created by automation ]] --- eng/SharedFramework.External.props | 21 +++++++++++-------- eng/build.ps1 | 3 +++ eng/build.sh | 7 +++++++ ...rosoft.Extensions.Caching.SqlServer.csproj | 6 ++++-- ....Extensions.Caching.SqlServer.Tests.csproj | 12 ++++++----- ...tensions.Caching.StackExchangeRedis.csproj | 9 +++++--- ...ns.Caching.StackExchangeRedis.Tests.csproj | 9 +++++--- ....Extensions.Caching.MicroBenchmarks.csproj | 4 +++- .../Microsoft.AspNetCore.Components.csproj | 5 ----- ....AspNetCore.Components.Server.Tests.csproj | 3 +-- ...Microsoft.AspNetCore.Components.Web.csproj | 2 -- ...t.AspNetCore.Components.WebAssembly.csproj | 1 - ...etCore.Components.WebAssembly.Tests.csproj | 1 - ...ions.Configuration.KeyPerFile.Tests.csproj | 9 +++++--- ...Microsoft.AspNetCore.DataProtection.csproj | 13 +++++++----- ...t.Extensions.FileProviders.Embedded.csproj | 5 ++++- ...nsions.FileProviders.Embedded.Tests.csproj | 7 +++++-- src/Framework/test/TestData.cs | 18 ---------------- ...Extensions.Diagnostics.HealthChecks.csproj | 8 ++++--- ...ions.Diagnostics.HealthChecks.Tests.csproj | 12 ++++++----- ...oft.AspNetCore.Hosting.Abstractions.csproj | 1 - .../src/Microsoft.AspNetCore.Hosting.csproj | 1 - .../Microsoft.AspNetCore.Hosting.Tests.csproj | 1 - ...NetCore.Hosting.Server.Abstractions.csproj | 1 - ...NetCore.Authentication.Abstractions.csproj | 1 - .../src/Microsoft.Net.Http.Headers.csproj | 1 - ...rosoft.AspNetCore.Http.Abstractions.csproj | 2 -- ....AspNetCore.Http.Abstractions.Tests.csproj | 1 - ...icrosoft.AspNetCore.Http.Extensions.csproj | 1 - .../Microsoft.AspNetCore.Http.Features.csproj | 3 +-- .../Http/src/Microsoft.AspNetCore.Http.csproj | 1 - .../src/Microsoft.AspNetCore.Routing.csproj | 1 - .../Microsoft.AspNetCore.Routing.Tests.csproj | 1 - ...crosoft.Extensions.Http.Polly.Tests.csproj | 10 +++++---- .../Microsoft.Extensions.Identity.Core.csproj | 5 ++++- ...icrosoft.Extensions.Identity.Stores.csproj | 4 +++- .../Microsoft.Extensions.Localization.csproj | 8 ++++--- ...ns.Localization.RootNamespace.Tests.csproj | 7 +++++-- ...osoft.Extensions.Localization.Tests.csproj | 9 +++++--- ...Extensions.Logging.AzureAppServices.csproj | 4 +++- ...ions.Logging.AzureAppServices.Tests.csproj | 15 +++++++------ .../CORS/src/Microsoft.AspNetCore.Cors.csproj | 4 ---- .../Microsoft.AspNetCore.Diagnostics.csproj | 2 -- ...AspNetCore.Diagnostics.HealthChecks.csproj | 1 - .../Microsoft.AspNetCore.HostFiltering.csproj | 1 - .../Microsoft.AspNetCore.HttpLogging.csproj | 1 - .../Microsoft.AspNetCore.HttpOverrides.csproj | 2 -- .../Microsoft.AspNetCore.HttpsPolicy.csproj | 1 - .../Microsoft.AspNetCore.Localization.csproj | 2 -- ...re.OutputCaching.StackExchangeRedis.csproj | 7 +++++-- ...osoft.AspNetCore.MiddlewareAnalysis.csproj | 1 - .../Microsoft.AspNetCore.OutputCaching.csproj | 1 - .../Microsoft.AspNetCore.RateLimiting.csproj | 2 -- ...oft.AspNetCore.RequestDecompression.csproj | 2 -- ...etCore.ResponseCaching.Abstractions.csproj | 4 ---- ...icrosoft.AspNetCore.ResponseCaching.csproj | 1 - ...soft.AspNetCore.ResponseCompression.csproj | 2 -- .../src/Microsoft.AspNetCore.Rewrite.csproj | 4 ---- .../src/Microsoft.AspNetCore.Session.csproj | 3 --- .../Microsoft.AspNetCore.Session.Tests.csproj | 1 - .../Microsoft.AspNetCore.StaticFiles.csproj | 2 -- .../Microsoft.AspNetCore.WebSockets.csproj | 2 -- .../src/Microsoft.AspNetCore.Mvc.Core.csproj | 2 -- ...Microsoft.AspNetCore.Mvc.TagHelpers.csproj | 1 - ...pleWebSiteWithWebApplicationBuilder.csproj | 1 - ...eWithWebApplicationBuilderException.csproj | 1 - .../Microsoft.AspNetCore.OpenApi.Tests.csproj | 1 - ...Microsoft.AspNetCore.Authentication.csproj | 1 - .../Microsoft.AspNetCore.Authorization.csproj | 6 ++++-- .../Microsoft.AspNetCore.CookiePolicy.csproj | 2 -- ...ft.AspNetCore.Server.IISIntegration.csproj | 2 -- ...soft.AspNetCore.Server.Kestrel.Core.csproj | 4 +--- ...Server.Kestrel.Transport.NamedPipes.csproj | 1 - ...tCore.Server.Kestrel.Transport.Quic.csproj | 2 -- ...re.Server.Kestrel.Transport.Sockets.csproj | 1 - ....AspNetCore.Http.Connections.Client.csproj | 6 ++++-- ...Microsoft.AspNetCore.SignalR.Common.csproj | 4 +++- .../Microsoft.AspNetCore.SignalR.Core.csproj | 2 -- ...pNetCore.SignalR.StackExchangeRedis.csproj | 1 - .../src/GetDocument.Insider.csproj | 5 ++++- .../src/dotnet-user-jwts.csproj | 1 - .../Microsoft.Extensions.Validation.csproj | 5 ----- ...xtensions.Validation.GeneratorTests.csproj | 1 - .../Microsoft.Extensions.WebEncoders.csproj | 9 ++++---- ...rosoft.Extensions.WebEncoders.Tests.csproj | 5 ++++- 85 files changed, 155 insertions(+), 188 deletions(-) diff --git a/eng/SharedFramework.External.props b/eng/SharedFramework.External.props index a24d266f8f27..c91c0b3421c3 100644 --- a/eng/SharedFramework.External.props +++ b/eng/SharedFramework.External.props @@ -7,9 +7,7 @@ - - @@ -19,18 +17,13 @@ - - - - - @@ -40,8 +33,6 @@ - - @@ -92,4 +83,16 @@ <_CompilationOnlyReference Include="System.Runtime.CompilerServices.Unsafe" /> <_CompilationOnlyReference Include="System.Text.Json" /> + + + <_CompilationOnlyReference Include="Microsoft.Extensions.Caching.Abstractions" /> + <_CompilationOnlyReference Include="Microsoft.Extensions.Configuration.Abstractions" /> + <_CompilationOnlyReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" /> + <_CompilationOnlyReference Include="Microsoft.Extensions.Diagnostics.Abstractions" /> + <_CompilationOnlyReference Include="Microsoft.Extensions.FileProviders.Abstractions" /> + <_CompilationOnlyReference Include="Microsoft.Extensions.Hosting.Abstractions" /> + <_CompilationOnlyReference Include="Microsoft.Extensions.Logging.Abstractions" /> + <_CompilationOnlyReference Include="Microsoft.Extensions.Options" /> + <_CompilationOnlyReference Include="Microsoft.Extensions.Primitives" /> + diff --git a/eng/build.ps1 b/eng/build.ps1 index 5fb28716d4c3..8f9409c26837 100644 --- a/eng/build.ps1 +++ b/eng/build.ps1 @@ -200,6 +200,9 @@ param( # Intentionally lowercase as tools.ps1 depends on it [switch]$fromVMR, + # Passed through to tools.ps1 MSBuild function + [string]$warnNotAsError = '', + # Capture the rest [Parameter(ValueFromRemainingArguments = $true)] [string[]]$MSBuildArguments diff --git a/eng/build.sh b/eng/build.sh index f1e0a4bf01b7..6508f548e77a 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -36,6 +36,7 @@ source_build='' product_build='' from_vmr='' warn_as_error=true +warn_not_as_error='' from_vmr='' source "$DIR/common/native/init-os-and-arch.sh" @@ -82,6 +83,7 @@ Options: --excludeCIBinarylog Don't output binary log by default in CI builds (short: -nobl). --verbosity|-v MSBuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] --warnAsError Sets warnaserror msbuild parameter: 'true' or 'false' + --warnNotAsError Sets a semi-colon delimited list of warning codes that should not be treated as errors --runtime-source-feed Additional feed that can be used when downloading .NET runtimes and SDKs --runtime-source-feed-key Key for feed that can be used when downloading .NET runtimes and SDKs @@ -258,6 +260,11 @@ while [[ $# -gt 0 ]]; do [ -z "${1:-}" ] && __error "Missing value for parameter --warnaserror" && __usage warn_as_error="${1:-}" ;; + -warnnotaserror) + shift + [ -z "${1:-}" ] && __error "Missing value for parameter --warnNotAsError" && __usage + warn_not_as_error="${1:-}" + ;; *) msbuild_args[${#msbuild_args[*]}]="$1" ;; diff --git a/src/Caching/SqlServer/src/Microsoft.Extensions.Caching.SqlServer.csproj b/src/Caching/SqlServer/src/Microsoft.Extensions.Caching.SqlServer.csproj index 3088ff699532..f668fa7a7e5e 100644 --- a/src/Caching/SqlServer/src/Microsoft.Extensions.Caching.SqlServer.csproj +++ b/src/Caching/SqlServer/src/Microsoft.Extensions.Caching.SqlServer.csproj @@ -16,8 +16,6 @@ - - @@ -28,4 +26,8 @@ + + + + diff --git a/src/Caching/SqlServer/test/Microsoft.Extensions.Caching.SqlServer.Tests.csproj b/src/Caching/SqlServer/test/Microsoft.Extensions.Caching.SqlServer.Tests.csproj index 6f95bd50684b..aec9c133c342 100644 --- a/src/Caching/SqlServer/test/Microsoft.Extensions.Caching.SqlServer.Tests.csproj +++ b/src/Caching/SqlServer/test/Microsoft.Extensions.Caching.SqlServer.Tests.csproj @@ -1,4 +1,4 @@ - + $(DefaultNetCoreTargetFramework);net472 @@ -9,16 +9,18 @@ - - - - + + + + + + diff --git a/src/Caching/StackExchangeRedis/src/Microsoft.Extensions.Caching.StackExchangeRedis.csproj b/src/Caching/StackExchangeRedis/src/Microsoft.Extensions.Caching.StackExchangeRedis.csproj index 4c53c8507e96..86cab43edab1 100644 --- a/src/Caching/StackExchangeRedis/src/Microsoft.Extensions.Caching.StackExchangeRedis.csproj +++ b/src/Caching/StackExchangeRedis/src/Microsoft.Extensions.Caching.StackExchangeRedis.csproj @@ -12,9 +12,6 @@ - - - @@ -32,4 +29,10 @@ + + + + + + diff --git a/src/Caching/StackExchangeRedis/test/Microsoft.Extensions.Caching.StackExchangeRedis.Tests.csproj b/src/Caching/StackExchangeRedis/test/Microsoft.Extensions.Caching.StackExchangeRedis.Tests.csproj index 6edc56986da7..6764c8e85854 100644 --- a/src/Caching/StackExchangeRedis/test/Microsoft.Extensions.Caching.StackExchangeRedis.Tests.csproj +++ b/src/Caching/StackExchangeRedis/test/Microsoft.Extensions.Caching.StackExchangeRedis.Tests.csproj @@ -1,15 +1,18 @@ - + $(DefaultNetCoreTargetFramework);net472 - - + + + + + diff --git a/src/Caching/perf/MicroBenchmarks/Microsoft.Extensions.Caching.MicroBenchmarks/Microsoft.Extensions.Caching.MicroBenchmarks.csproj b/src/Caching/perf/MicroBenchmarks/Microsoft.Extensions.Caching.MicroBenchmarks/Microsoft.Extensions.Caching.MicroBenchmarks.csproj index 9f75b176aac9..a7e915c6164f 100644 --- a/src/Caching/perf/MicroBenchmarks/Microsoft.Extensions.Caching.MicroBenchmarks/Microsoft.Extensions.Caching.MicroBenchmarks.csproj +++ b/src/Caching/perf/MicroBenchmarks/Microsoft.Extensions.Caching.MicroBenchmarks/Microsoft.Extensions.Caching.MicroBenchmarks.csproj @@ -14,7 +14,6 @@ - @@ -22,4 +21,7 @@ + + + diff --git a/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj b/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj index ba3ae6420645..81c06ff0f26a 100644 --- a/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj +++ b/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj @@ -30,11 +30,6 @@ - - - - - diff --git a/src/Components/Server/test/Microsoft.AspNetCore.Components.Server.Tests.csproj b/src/Components/Server/test/Microsoft.AspNetCore.Components.Server.Tests.csproj index 4e98df25bed5..be9aee0d1765 100644 --- a/src/Components/Server/test/Microsoft.AspNetCore.Components.Server.Tests.csproj +++ b/src/Components/Server/test/Microsoft.AspNetCore.Components.Server.Tests.csproj @@ -1,4 +1,4 @@ - + $(DefaultNetCoreTargetFramework) @@ -23,7 +23,6 @@ - diff --git a/src/Components/Web/src/Microsoft.AspNetCore.Components.Web.csproj b/src/Components/Web/src/Microsoft.AspNetCore.Components.Web.csproj index 294881d45b9b..b03c8e59e1fc 100644 --- a/src/Components/Web/src/Microsoft.AspNetCore.Components.Web.csproj +++ b/src/Components/Web/src/Microsoft.AspNetCore.Components.Web.csproj @@ -23,8 +23,6 @@ - - diff --git a/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj b/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj index 25adc6438c58..65816ef34f95 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj +++ b/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj @@ -20,7 +20,6 @@ - diff --git a/src/Components/WebAssembly/WebAssembly/test/Microsoft.AspNetCore.Components.WebAssembly.Tests.csproj b/src/Components/WebAssembly/WebAssembly/test/Microsoft.AspNetCore.Components.WebAssembly.Tests.csproj index 405adce011f0..f7a0b0bde1e8 100644 --- a/src/Components/WebAssembly/WebAssembly/test/Microsoft.AspNetCore.Components.WebAssembly.Tests.csproj +++ b/src/Components/WebAssembly/WebAssembly/test/Microsoft.AspNetCore.Components.WebAssembly.Tests.csproj @@ -9,7 +9,6 @@ - diff --git a/src/Configuration.KeyPerFile/test/Microsoft.Extensions.Configuration.KeyPerFile.Tests.csproj b/src/Configuration.KeyPerFile/test/Microsoft.Extensions.Configuration.KeyPerFile.Tests.csproj index 09120547434b..735e5c2fb6bb 100644 --- a/src/Configuration.KeyPerFile/test/Microsoft.Extensions.Configuration.KeyPerFile.Tests.csproj +++ b/src/Configuration.KeyPerFile/test/Microsoft.Extensions.Configuration.KeyPerFile.Tests.csproj @@ -1,17 +1,20 @@ - + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) - - + + + + + diff --git a/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj b/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj index 9e59858aa7ee..9738a6e9c54e 100644 --- a/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj +++ b/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj @@ -1,4 +1,4 @@ - + ASP.NET Core logic to protect and unprotect data, similar to DPAPI. @@ -28,10 +28,6 @@ - - - - @@ -60,4 +56,11 @@ + + + + + + + diff --git a/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj b/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj index 590c4e980042..ee2b4a394587 100644 --- a/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj +++ b/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj @@ -20,12 +20,15 @@ - + + + + diff --git a/src/FileProviders/Embedded/test/Microsoft.Extensions.FileProviders.Embedded.Tests.csproj b/src/FileProviders/Embedded/test/Microsoft.Extensions.FileProviders.Embedded.Tests.csproj index 62c48f5ccbec..603f792f5794 100644 --- a/src/FileProviders/Embedded/test/Microsoft.Extensions.FileProviders.Embedded.Tests.csproj +++ b/src/FileProviders/Embedded/test/Microsoft.Extensions.FileProviders.Embedded.Tests.csproj @@ -1,4 +1,4 @@ - + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) @@ -13,8 +13,11 @@ - + + + + diff --git a/src/Framework/test/TestData.cs b/src/Framework/test/TestData.cs index ba2971e8a6c0..3cabf5cfb7b3 100644 --- a/src/Framework/test/TestData.cs +++ b/src/Framework/test/TestData.cs @@ -105,10 +105,8 @@ static TestData() "Microsoft.AspNetCore.StaticAssets", "Microsoft.AspNetCore.WebSockets", "Microsoft.AspNetCore.WebUtilities", - "Microsoft.Extensions.Caching.Abstractions", "Microsoft.Extensions.Caching.Memory", "Microsoft.Extensions.Configuration", - "Microsoft.Extensions.Configuration.Abstractions", "Microsoft.Extensions.Configuration.Binder", "Microsoft.Extensions.Configuration.CommandLine", "Microsoft.Extensions.Configuration.EnvironmentVariables", @@ -119,26 +117,21 @@ static TestData() "Microsoft.Extensions.Configuration.UserSecrets", "Microsoft.Extensions.Configuration.Xml", "Microsoft.Extensions.DependencyInjection", - "Microsoft.Extensions.DependencyInjection.Abstractions", "Microsoft.Extensions.Diagnostics", - "Microsoft.Extensions.Diagnostics.Abstractions", "Microsoft.Extensions.Diagnostics.HealthChecks", "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions", - "Microsoft.Extensions.FileProviders.Abstractions", "Microsoft.Extensions.FileProviders.Composite", "Microsoft.Extensions.FileProviders.Embedded", "Microsoft.Extensions.FileProviders.Physical", "Microsoft.Extensions.FileSystemGlobbing", "Microsoft.Extensions.Features", "Microsoft.Extensions.Hosting", - "Microsoft.Extensions.Hosting.Abstractions", "Microsoft.Extensions.Http", "Microsoft.Extensions.Identity.Core", "Microsoft.Extensions.Identity.Stores", "Microsoft.Extensions.Localization", "Microsoft.Extensions.Localization.Abstractions", "Microsoft.Extensions.Logging", - "Microsoft.Extensions.Logging.Abstractions", "Microsoft.Extensions.Logging.Configuration", "Microsoft.Extensions.Logging.Console", "Microsoft.Extensions.Logging.Debug", @@ -146,10 +139,8 @@ static TestData() "Microsoft.Extensions.Logging.EventSource", "Microsoft.Extensions.Logging.TraceSource", "Microsoft.Extensions.ObjectPool", - "Microsoft.Extensions.Options", "Microsoft.Extensions.Options.ConfigurationExtensions", "Microsoft.Extensions.Options.DataAnnotations", - "Microsoft.Extensions.Primitives", "Microsoft.Extensions.WebEncoders", "Microsoft.Extensions.Validation", "Microsoft.JSInterop", @@ -258,9 +249,7 @@ static TestData() { "Microsoft.AspNetCore.WebSockets" }, { "Microsoft.AspNetCore.WebUtilities" }, { "Microsoft.AspNetCore" }, - { "Microsoft.Extensions.Caching.Abstractions" }, { "Microsoft.Extensions.Caching.Memory" }, - { "Microsoft.Extensions.Configuration.Abstractions" }, { "Microsoft.Extensions.Configuration.Binder" }, { "Microsoft.Extensions.Configuration.CommandLine" }, { "Microsoft.Extensions.Configuration.EnvironmentVariables" }, @@ -271,26 +260,21 @@ static TestData() { "Microsoft.Extensions.Configuration.UserSecrets" }, { "Microsoft.Extensions.Configuration.Xml" }, { "Microsoft.Extensions.Configuration" }, - { "Microsoft.Extensions.DependencyInjection.Abstractions" }, { "Microsoft.Extensions.DependencyInjection" }, { "Microsoft.Extensions.Diagnostics" }, - { "Microsoft.Extensions.Diagnostics.Abstractions" }, { "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" }, { "Microsoft.Extensions.Diagnostics.HealthChecks" }, { "Microsoft.Extensions.Features" }, - { "Microsoft.Extensions.FileProviders.Abstractions" }, { "Microsoft.Extensions.FileProviders.Composite" }, { "Microsoft.Extensions.FileProviders.Embedded" }, { "Microsoft.Extensions.FileProviders.Physical" }, { "Microsoft.Extensions.FileSystemGlobbing" }, - { "Microsoft.Extensions.Hosting.Abstractions" }, { "Microsoft.Extensions.Hosting" }, { "Microsoft.Extensions.Http" }, { "Microsoft.Extensions.Identity.Core" }, { "Microsoft.Extensions.Identity.Stores" }, { "Microsoft.Extensions.Localization.Abstractions" }, { "Microsoft.Extensions.Localization" }, - { "Microsoft.Extensions.Logging.Abstractions" }, { "Microsoft.Extensions.Logging.Configuration" }, { "Microsoft.Extensions.Logging.Console" }, { "Microsoft.Extensions.Logging.Debug" }, @@ -301,8 +285,6 @@ static TestData() { "Microsoft.Extensions.ObjectPool" }, { "Microsoft.Extensions.Options.ConfigurationExtensions" }, { "Microsoft.Extensions.Options.DataAnnotations" }, - { "Microsoft.Extensions.Options" }, - { "Microsoft.Extensions.Primitives" }, { "Microsoft.Extensions.WebEncoders" }, { "Microsoft.Extensions.Validation" }, { "Microsoft.JSInterop" }, diff --git a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj index 248c79b944a4..4714df818788 100644 --- a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj +++ b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj @@ -33,12 +33,14 @@ Microsoft.Extensions.Diagnostics.HealthChecks.IHealthChecksBuilder - - - + + + + + diff --git a/src/HealthChecks/HealthChecks/test/Microsoft.Extensions.Diagnostics.HealthChecks.Tests.csproj b/src/HealthChecks/HealthChecks/test/Microsoft.Extensions.Diagnostics.HealthChecks.Tests.csproj index 8b62bed1155f..497b9c69f4f8 100644 --- a/src/HealthChecks/HealthChecks/test/Microsoft.Extensions.Diagnostics.HealthChecks.Tests.csproj +++ b/src/HealthChecks/HealthChecks/test/Microsoft.Extensions.Diagnostics.HealthChecks.Tests.csproj @@ -7,19 +7,21 @@ - - - - - + + + + + + + diff --git a/src/Hosting/Abstractions/src/Microsoft.AspNetCore.Hosting.Abstractions.csproj b/src/Hosting/Abstractions/src/Microsoft.AspNetCore.Hosting.Abstractions.csproj index 9f0bf4a2730d..9f3d6600c99e 100644 --- a/src/Hosting/Abstractions/src/Microsoft.AspNetCore.Hosting.Abstractions.csproj +++ b/src/Hosting/Abstractions/src/Microsoft.AspNetCore.Hosting.Abstractions.csproj @@ -15,7 +15,6 @@ - diff --git a/src/Hosting/Hosting/src/Microsoft.AspNetCore.Hosting.csproj b/src/Hosting/Hosting/src/Microsoft.AspNetCore.Hosting.csproj index 6b4a9a2fa1ac..a1ff501115da 100644 --- a/src/Hosting/Hosting/src/Microsoft.AspNetCore.Hosting.csproj +++ b/src/Hosting/Hosting/src/Microsoft.AspNetCore.Hosting.csproj @@ -39,7 +39,6 @@ - diff --git a/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj b/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj index 28517af1933d..be280262edc6 100644 --- a/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj +++ b/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj @@ -33,7 +33,6 @@ - diff --git a/src/Hosting/Server.Abstractions/src/Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj b/src/Hosting/Server.Abstractions/src/Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj index 070478675b85..41ba3a1615d2 100644 --- a/src/Hosting/Server.Abstractions/src/Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj +++ b/src/Hosting/Server.Abstractions/src/Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj @@ -13,7 +13,6 @@ - diff --git a/src/Http/Authentication.Abstractions/src/Microsoft.AspNetCore.Authentication.Abstractions.csproj b/src/Http/Authentication.Abstractions/src/Microsoft.AspNetCore.Authentication.Abstractions.csproj index 4a47ea7e7bd3..c9e2e555d846 100644 --- a/src/Http/Authentication.Abstractions/src/Microsoft.AspNetCore.Authentication.Abstractions.csproj +++ b/src/Http/Authentication.Abstractions/src/Microsoft.AspNetCore.Authentication.Abstractions.csproj @@ -12,7 +12,6 @@ - diff --git a/src/Http/Headers/src/Microsoft.Net.Http.Headers.csproj b/src/Http/Headers/src/Microsoft.Net.Http.Headers.csproj index a1107b97ec06..6c55a32d43f1 100644 --- a/src/Http/Headers/src/Microsoft.Net.Http.Headers.csproj +++ b/src/Http/Headers/src/Microsoft.Net.Http.Headers.csproj @@ -12,7 +12,6 @@ - diff --git a/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj index 37e17a0f0f49..4f8964fc3085 100644 --- a/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -19,8 +19,6 @@ Microsoft.AspNetCore.Http.HttpResponse - - diff --git a/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index 7f93e8591ce7..c5f91b713d47 100644 --- a/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -38,7 +38,6 @@ - diff --git a/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj index bf8c388af924..3f1a922611d0 100644 --- a/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj @@ -43,7 +43,6 @@ - diff --git a/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj index 51bf46bc0bae..487ab3e2f47a 100644 --- a/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj @@ -1,4 +1,4 @@ - + ASP.NET Core HTTP feature interface definitions. @@ -13,7 +13,6 @@ - diff --git a/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj b/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj index a28c02a2be02..e0d764788e8a 100644 --- a/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj +++ b/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj @@ -34,7 +34,6 @@ - diff --git a/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj b/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj index fc7303fe15dd..ec6f86c04b1a 100644 --- a/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj +++ b/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj @@ -51,7 +51,6 @@ - diff --git a/src/Http/Routing/test/UnitTests/Microsoft.AspNetCore.Routing.Tests.csproj b/src/Http/Routing/test/UnitTests/Microsoft.AspNetCore.Routing.Tests.csproj index 780ed4542bc8..41422e7d5109 100644 --- a/src/Http/Routing/test/UnitTests/Microsoft.AspNetCore.Routing.Tests.csproj +++ b/src/Http/Routing/test/UnitTests/Microsoft.AspNetCore.Routing.Tests.csproj @@ -23,7 +23,6 @@ - diff --git a/src/HttpClientFactory/Polly/test/Microsoft.Extensions.Http.Polly.Tests.csproj b/src/HttpClientFactory/Polly/test/Microsoft.Extensions.Http.Polly.Tests.csproj index 3bf9b6768f17..941d92da44ea 100644 --- a/src/HttpClientFactory/Polly/test/Microsoft.Extensions.Http.Polly.Tests.csproj +++ b/src/HttpClientFactory/Polly/test/Microsoft.Extensions.Http.Polly.Tests.csproj @@ -6,18 +6,20 @@ - - - - + + + + + + diff --git a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj index 534517af55d2..daa020256c5d 100644 --- a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj +++ b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj @@ -14,7 +14,6 @@ - @@ -36,4 +35,8 @@ + + + + diff --git a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj index 5c0bc03e774c..03968c280b73 100644 --- a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj +++ b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj @@ -11,7 +11,6 @@ - @@ -21,4 +20,7 @@ + + + diff --git a/src/Localization/Localization/src/Microsoft.Extensions.Localization.csproj b/src/Localization/Localization/src/Microsoft.Extensions.Localization.csproj index 56356a3ce7fc..5b18ee379ad5 100644 --- a/src/Localization/Localization/src/Microsoft.Extensions.Localization.csproj +++ b/src/Localization/Localization/src/Microsoft.Extensions.Localization.csproj @@ -12,10 +12,7 @@ - - - @@ -28,4 +25,9 @@ + + + + + diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj index 793627e68337..1ce3a60d678e 100644 --- a/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj +++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj @@ -13,8 +13,6 @@ - - @@ -23,4 +21,9 @@ ValuesController.Designer.cs + + + + + diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj index f0b96ae1f3c3..bebd67749d0c 100644 --- a/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj +++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj @@ -1,4 +1,4 @@ - + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) @@ -8,10 +8,13 @@ - - + + + + + diff --git a/src/Logging.AzureAppServices/src/Microsoft.Extensions.Logging.AzureAppServices.csproj b/src/Logging.AzureAppServices/src/Microsoft.Extensions.Logging.AzureAppServices.csproj index b69adf63522a..ac3c9493733f 100644 --- a/src/Logging.AzureAppServices/src/Microsoft.Extensions.Logging.AzureAppServices.csproj +++ b/src/Logging.AzureAppServices/src/Microsoft.Extensions.Logging.AzureAppServices.csproj @@ -15,7 +15,6 @@ - @@ -35,4 +34,7 @@ + + + diff --git a/src/Logging.AzureAppServices/test/Microsoft.Extensions.Logging.AzureAppServices.Tests.csproj b/src/Logging.AzureAppServices/test/Microsoft.Extensions.Logging.AzureAppServices.Tests.csproj index fde35d5fa24d..d40e8bc2826f 100644 --- a/src/Logging.AzureAppServices/test/Microsoft.Extensions.Logging.AzureAppServices.Tests.csproj +++ b/src/Logging.AzureAppServices/test/Microsoft.Extensions.Logging.AzureAppServices.Tests.csproj @@ -1,27 +1,30 @@ - + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) - - - - - + + + + + + + + diff --git a/src/Middleware/CORS/src/Microsoft.AspNetCore.Cors.csproj b/src/Middleware/CORS/src/Microsoft.AspNetCore.Cors.csproj index 99fdcf0dc22d..ff5a353fccdb 100644 --- a/src/Middleware/CORS/src/Microsoft.AspNetCore.Cors.csproj +++ b/src/Middleware/CORS/src/Microsoft.AspNetCore.Cors.csproj @@ -19,10 +19,6 @@ Microsoft.AspNetCore.Cors.EnableCorsAttribute - - - - diff --git a/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj b/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj index 49c973fd10bc..8476abda54be 100644 --- a/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj +++ b/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj @@ -31,8 +31,6 @@ - - diff --git a/src/Middleware/HealthChecks/src/Microsoft.AspNetCore.Diagnostics.HealthChecks.csproj b/src/Middleware/HealthChecks/src/Microsoft.AspNetCore.Diagnostics.HealthChecks.csproj index de41a5d9dbe6..3aa472886e0b 100644 --- a/src/Middleware/HealthChecks/src/Microsoft.AspNetCore.Diagnostics.HealthChecks.csproj +++ b/src/Middleware/HealthChecks/src/Microsoft.AspNetCore.Diagnostics.HealthChecks.csproj @@ -16,7 +16,6 @@ - diff --git a/src/Middleware/HostFiltering/src/Microsoft.AspNetCore.HostFiltering.csproj b/src/Middleware/HostFiltering/src/Microsoft.AspNetCore.HostFiltering.csproj index 5e829e3aa2a4..5e25bde67710 100644 --- a/src/Middleware/HostFiltering/src/Microsoft.AspNetCore.HostFiltering.csproj +++ b/src/Middleware/HostFiltering/src/Microsoft.AspNetCore.HostFiltering.csproj @@ -18,7 +18,6 @@ - diff --git a/src/Middleware/HttpLogging/src/Microsoft.AspNetCore.HttpLogging.csproj b/src/Middleware/HttpLogging/src/Microsoft.AspNetCore.HttpLogging.csproj index 2bfaf4114d9b..824563a982f1 100644 --- a/src/Middleware/HttpLogging/src/Microsoft.AspNetCore.HttpLogging.csproj +++ b/src/Middleware/HttpLogging/src/Microsoft.AspNetCore.HttpLogging.csproj @@ -16,7 +16,6 @@ - diff --git a/src/Middleware/HttpOverrides/src/Microsoft.AspNetCore.HttpOverrides.csproj b/src/Middleware/HttpOverrides/src/Microsoft.AspNetCore.HttpOverrides.csproj index 8e4bc6830273..0c18a605971d 100644 --- a/src/Middleware/HttpOverrides/src/Microsoft.AspNetCore.HttpOverrides.csproj +++ b/src/Middleware/HttpOverrides/src/Microsoft.AspNetCore.HttpOverrides.csproj @@ -16,8 +16,6 @@ - - diff --git a/src/Middleware/HttpsPolicy/src/Microsoft.AspNetCore.HttpsPolicy.csproj b/src/Middleware/HttpsPolicy/src/Microsoft.AspNetCore.HttpsPolicy.csproj index c54cf7d87c3d..75c7c931773a 100644 --- a/src/Middleware/HttpsPolicy/src/Microsoft.AspNetCore.HttpsPolicy.csproj +++ b/src/Middleware/HttpsPolicy/src/Microsoft.AspNetCore.HttpsPolicy.csproj @@ -20,6 +20,5 @@ - diff --git a/src/Middleware/Localization/src/Microsoft.AspNetCore.Localization.csproj b/src/Middleware/Localization/src/Microsoft.AspNetCore.Localization.csproj index 6a0d0d94fca9..0d8ee896c6fa 100644 --- a/src/Middleware/Localization/src/Microsoft.AspNetCore.Localization.csproj +++ b/src/Middleware/Localization/src/Microsoft.AspNetCore.Localization.csproj @@ -17,8 +17,6 @@ - - diff --git a/src/Middleware/Microsoft.AspNetCore.OutputCaching.StackExchangeRedis/src/Microsoft.AspNetCore.OutputCaching.StackExchangeRedis.csproj b/src/Middleware/Microsoft.AspNetCore.OutputCaching.StackExchangeRedis/src/Microsoft.AspNetCore.OutputCaching.StackExchangeRedis.csproj index 9a3d56b49250..ec3c48e02fb8 100644 --- a/src/Middleware/Microsoft.AspNetCore.OutputCaching.StackExchangeRedis/src/Microsoft.AspNetCore.OutputCaching.StackExchangeRedis.csproj +++ b/src/Middleware/Microsoft.AspNetCore.OutputCaching.StackExchangeRedis/src/Microsoft.AspNetCore.OutputCaching.StackExchangeRedis.csproj @@ -10,9 +10,7 @@ - - @@ -25,4 +23,9 @@ + + + + + diff --git a/src/Middleware/MiddlewareAnalysis/src/Microsoft.AspNetCore.MiddlewareAnalysis.csproj b/src/Middleware/MiddlewareAnalysis/src/Microsoft.AspNetCore.MiddlewareAnalysis.csproj index 8717fca3c1b6..651809d3c386 100644 --- a/src/Middleware/MiddlewareAnalysis/src/Microsoft.AspNetCore.MiddlewareAnalysis.csproj +++ b/src/Middleware/MiddlewareAnalysis/src/Microsoft.AspNetCore.MiddlewareAnalysis.csproj @@ -11,7 +11,6 @@ - diff --git a/src/Middleware/OutputCaching/src/Microsoft.AspNetCore.OutputCaching.csproj b/src/Middleware/OutputCaching/src/Microsoft.AspNetCore.OutputCaching.csproj index ae669dfabc86..d8f1e90dd3b5 100644 --- a/src/Middleware/OutputCaching/src/Microsoft.AspNetCore.OutputCaching.csproj +++ b/src/Middleware/OutputCaching/src/Microsoft.AspNetCore.OutputCaching.csproj @@ -20,7 +20,6 @@ - diff --git a/src/Middleware/RateLimiting/src/Microsoft.AspNetCore.RateLimiting.csproj b/src/Middleware/RateLimiting/src/Microsoft.AspNetCore.RateLimiting.csproj index 10ee122da393..3d43a61bf5a7 100644 --- a/src/Middleware/RateLimiting/src/Microsoft.AspNetCore.RateLimiting.csproj +++ b/src/Middleware/RateLimiting/src/Microsoft.AspNetCore.RateLimiting.csproj @@ -12,8 +12,6 @@ - - diff --git a/src/Middleware/RequestDecompression/src/Microsoft.AspNetCore.RequestDecompression.csproj b/src/Middleware/RequestDecompression/src/Microsoft.AspNetCore.RequestDecompression.csproj index 257fe959bf59..fd5932d5508d 100644 --- a/src/Middleware/RequestDecompression/src/Microsoft.AspNetCore.RequestDecompression.csproj +++ b/src/Middleware/RequestDecompression/src/Microsoft.AspNetCore.RequestDecompression.csproj @@ -15,8 +15,6 @@ - - diff --git a/src/Middleware/ResponseCaching.Abstractions/src/Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj b/src/Middleware/ResponseCaching.Abstractions/src/Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj index 794dcb7accb8..7015a93ae6c9 100644 --- a/src/Middleware/ResponseCaching.Abstractions/src/Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj +++ b/src/Middleware/ResponseCaching.Abstractions/src/Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj @@ -10,8 +10,4 @@ true - - - - diff --git a/src/Middleware/ResponseCaching/src/Microsoft.AspNetCore.ResponseCaching.csproj b/src/Middleware/ResponseCaching/src/Microsoft.AspNetCore.ResponseCaching.csproj index 8c2b8374eb1c..28c0cc7c44b9 100644 --- a/src/Middleware/ResponseCaching/src/Microsoft.AspNetCore.ResponseCaching.csproj +++ b/src/Middleware/ResponseCaching/src/Microsoft.AspNetCore.ResponseCaching.csproj @@ -18,7 +18,6 @@ - diff --git a/src/Middleware/ResponseCompression/src/Microsoft.AspNetCore.ResponseCompression.csproj b/src/Middleware/ResponseCompression/src/Microsoft.AspNetCore.ResponseCompression.csproj index 3f1304cd1678..23e0da6cdefa 100644 --- a/src/Middleware/ResponseCompression/src/Microsoft.AspNetCore.ResponseCompression.csproj +++ b/src/Middleware/ResponseCompression/src/Microsoft.AspNetCore.ResponseCompression.csproj @@ -15,8 +15,6 @@ - - diff --git a/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj b/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj index 5362fd8d6a63..959133054dd6 100644 --- a/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj +++ b/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj @@ -20,10 +20,6 @@ - - - - diff --git a/src/Middleware/Session/src/Microsoft.AspNetCore.Session.csproj b/src/Middleware/Session/src/Microsoft.AspNetCore.Session.csproj index ab8485be124a..63dfd979c7f9 100644 --- a/src/Middleware/Session/src/Microsoft.AspNetCore.Session.csproj +++ b/src/Middleware/Session/src/Microsoft.AspNetCore.Session.csproj @@ -15,9 +15,6 @@ - - - diff --git a/src/Middleware/Session/test/Microsoft.AspNetCore.Session.Tests.csproj b/src/Middleware/Session/test/Microsoft.AspNetCore.Session.Tests.csproj index 526db409cad3..2a907ed034b2 100644 --- a/src/Middleware/Session/test/Microsoft.AspNetCore.Session.Tests.csproj +++ b/src/Middleware/Session/test/Microsoft.AspNetCore.Session.Tests.csproj @@ -6,7 +6,6 @@ - diff --git a/src/Middleware/StaticFiles/src/Microsoft.AspNetCore.StaticFiles.csproj b/src/Middleware/StaticFiles/src/Microsoft.AspNetCore.StaticFiles.csproj index a1e7a2c279aa..fa78138e03eb 100644 --- a/src/Middleware/StaticFiles/src/Microsoft.AspNetCore.StaticFiles.csproj +++ b/src/Middleware/StaticFiles/src/Microsoft.AspNetCore.StaticFiles.csproj @@ -21,8 +21,6 @@ - - diff --git a/src/Middleware/WebSockets/src/Microsoft.AspNetCore.WebSockets.csproj b/src/Middleware/WebSockets/src/Microsoft.AspNetCore.WebSockets.csproj index 25b52527a08f..f4ef4b533aa6 100644 --- a/src/Middleware/WebSockets/src/Microsoft.AspNetCore.WebSockets.csproj +++ b/src/Middleware/WebSockets/src/Microsoft.AspNetCore.WebSockets.csproj @@ -15,8 +15,6 @@ - - diff --git a/src/Mvc/Mvc.Core/src/Microsoft.AspNetCore.Mvc.Core.csproj b/src/Mvc/Mvc.Core/src/Microsoft.AspNetCore.Mvc.Core.csproj index 467923182b89..08b824f85943 100644 --- a/src/Mvc/Mvc.Core/src/Microsoft.AspNetCore.Mvc.Core.csproj +++ b/src/Mvc/Mvc.Core/src/Microsoft.AspNetCore.Mvc.Core.csproj @@ -63,8 +63,6 @@ Microsoft.AspNetCore.Mvc.RouteAttribute - - diff --git a/src/Mvc/Mvc.TagHelpers/src/Microsoft.AspNetCore.Mvc.TagHelpers.csproj b/src/Mvc/Mvc.TagHelpers/src/Microsoft.AspNetCore.Mvc.TagHelpers.csproj index 14e4207cebc9..17a0360b7eb2 100644 --- a/src/Mvc/Mvc.TagHelpers/src/Microsoft.AspNetCore.Mvc.TagHelpers.csproj +++ b/src/Mvc/Mvc.TagHelpers/src/Microsoft.AspNetCore.Mvc.TagHelpers.csproj @@ -29,7 +29,6 @@ - diff --git a/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilder/SimpleWebSiteWithWebApplicationBuilder.csproj b/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilder/SimpleWebSiteWithWebApplicationBuilder.csproj index fb8209b87993..d5713d6bcd38 100644 --- a/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilder/SimpleWebSiteWithWebApplicationBuilder.csproj +++ b/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilder/SimpleWebSiteWithWebApplicationBuilder.csproj @@ -45,6 +45,5 @@ - diff --git a/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilderException/SimpleWebSiteWithWebApplicationBuilderException.csproj b/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilderException/SimpleWebSiteWithWebApplicationBuilderException.csproj index 429e6974c809..ecb350762daf 100644 --- a/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilderException/SimpleWebSiteWithWebApplicationBuilderException.csproj +++ b/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilderException/SimpleWebSiteWithWebApplicationBuilderException.csproj @@ -28,6 +28,5 @@ - diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Microsoft.AspNetCore.OpenApi.Tests.csproj b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Microsoft.AspNetCore.OpenApi.Tests.csproj index 1a4f13d2baf2..d1446fdf4bc9 100644 --- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Microsoft.AspNetCore.OpenApi.Tests.csproj +++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Microsoft.AspNetCore.OpenApi.Tests.csproj @@ -38,7 +38,6 @@ - diff --git a/src/Security/Authentication/Core/src/Microsoft.AspNetCore.Authentication.csproj b/src/Security/Authentication/Core/src/Microsoft.AspNetCore.Authentication.csproj index 033969615f1b..0a9f4a34f0dd 100644 --- a/src/Security/Authentication/Core/src/Microsoft.AspNetCore.Authentication.csproj +++ b/src/Security/Authentication/Core/src/Microsoft.AspNetCore.Authentication.csproj @@ -22,7 +22,6 @@ - diff --git a/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj b/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj index 1d2f6d562069..de4ce273fc21 100644 --- a/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj +++ b/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj @@ -16,9 +16,7 @@ Microsoft.AspNetCore.Authorization.AuthorizeAttribute - - @@ -36,4 +34,8 @@ Microsoft.AspNetCore.Authorization.AuthorizeAttribute + + + + diff --git a/src/Security/CookiePolicy/src/Microsoft.AspNetCore.CookiePolicy.csproj b/src/Security/CookiePolicy/src/Microsoft.AspNetCore.CookiePolicy.csproj index c293738b2de0..89d60757a83f 100644 --- a/src/Security/CookiePolicy/src/Microsoft.AspNetCore.CookiePolicy.csproj +++ b/src/Security/CookiePolicy/src/Microsoft.AspNetCore.CookiePolicy.csproj @@ -14,8 +14,6 @@ - - diff --git a/src/Servers/IIS/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration.csproj b/src/Servers/IIS/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration.csproj index 21c32002151e..ca7d226f2011 100644 --- a/src/Servers/IIS/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration.csproj +++ b/src/Servers/IIS/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration.csproj @@ -24,8 +24,6 @@ - - diff --git a/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj b/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj index 9ca9d863a5cc..46680084210e 100644 --- a/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj +++ b/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj @@ -1,4 +1,4 @@ - + Core components of ASP.NET Core Kestrel cross-platform web server. @@ -50,8 +50,6 @@ - - diff --git a/src/Servers/Kestrel/Transport.NamedPipes/src/Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes.csproj b/src/Servers/Kestrel/Transport.NamedPipes/src/Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes.csproj index 61735851bb84..11f0ebe239b4 100644 --- a/src/Servers/Kestrel/Transport.NamedPipes/src/Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes.csproj +++ b/src/Servers/Kestrel/Transport.NamedPipes/src/Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes.csproj @@ -28,7 +28,6 @@ - diff --git a/src/Servers/Kestrel/Transport.Quic/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj b/src/Servers/Kestrel/Transport.Quic/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj index 58d1e04125cf..971d836967a0 100644 --- a/src/Servers/Kestrel/Transport.Quic/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj +++ b/src/Servers/Kestrel/Transport.Quic/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj @@ -35,8 +35,6 @@ - - diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj b/src/Servers/Kestrel/Transport.Sockets/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj index 9f225bde1142..490de615e5d2 100644 --- a/src/Servers/Kestrel/Transport.Sockets/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj +++ b/src/Servers/Kestrel/Transport.Sockets/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj @@ -23,7 +23,6 @@ - diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj b/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj index 4086df48687e..a5ca73828243 100644 --- a/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj +++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj @@ -23,8 +23,6 @@ - - @@ -44,4 +42,8 @@ + + + + diff --git a/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj b/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj index 85a102328da2..2e69046a0780 100644 --- a/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj +++ b/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj @@ -26,7 +26,6 @@ - + + + diff --git a/src/SignalR/server/Core/src/Microsoft.AspNetCore.SignalR.Core.csproj b/src/SignalR/server/Core/src/Microsoft.AspNetCore.SignalR.Core.csproj index 0f01a615142d..2c4284e7ab3d 100644 --- a/src/SignalR/server/Core/src/Microsoft.AspNetCore.SignalR.Core.csproj +++ b/src/SignalR/server/Core/src/Microsoft.AspNetCore.SignalR.Core.csproj @@ -29,8 +29,6 @@ - - diff --git a/src/SignalR/server/StackExchangeRedis/src/Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj b/src/SignalR/server/StackExchangeRedis/src/Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj index deda497d1ec2..8a86a0564eed 100644 --- a/src/SignalR/server/StackExchangeRedis/src/Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj +++ b/src/SignalR/server/StackExchangeRedis/src/Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj @@ -17,7 +17,6 @@ - diff --git a/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj b/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj index df9ebcffb390..59ef5624eeca 100644 --- a/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj +++ b/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj @@ -18,7 +18,6 @@ - @@ -39,4 +38,8 @@ + + + + diff --git a/src/Tools/dotnet-user-jwts/src/dotnet-user-jwts.csproj b/src/Tools/dotnet-user-jwts/src/dotnet-user-jwts.csproj index 2947cd817fd1..9bdeb62e4a7a 100644 --- a/src/Tools/dotnet-user-jwts/src/dotnet-user-jwts.csproj +++ b/src/Tools/dotnet-user-jwts/src/dotnet-user-jwts.csproj @@ -28,7 +28,6 @@ - diff --git a/src/Validation/src/Microsoft.Extensions.Validation.csproj b/src/Validation/src/Microsoft.Extensions.Validation.csproj index 35405452fdd3..d78f6462e84f 100644 --- a/src/Validation/src/Microsoft.Extensions.Validation.csproj +++ b/src/Validation/src/Microsoft.Extensions.Validation.csproj @@ -24,11 +24,6 @@ - - - - - diff --git a/src/Validation/test/Microsoft.Extensions.Validation.GeneratorTests/Microsoft.Extensions.Validation.GeneratorTests.csproj b/src/Validation/test/Microsoft.Extensions.Validation.GeneratorTests/Microsoft.Extensions.Validation.GeneratorTests.csproj index 4aa4915d9cff..948f7fc5b041 100644 --- a/src/Validation/test/Microsoft.Extensions.Validation.GeneratorTests/Microsoft.Extensions.Validation.GeneratorTests.csproj +++ b/src/Validation/test/Microsoft.Extensions.Validation.GeneratorTests/Microsoft.Extensions.Validation.GeneratorTests.csproj @@ -46,7 +46,6 @@ - diff --git a/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj b/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj index d260269d546f..07434ee6beeb 100644 --- a/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj +++ b/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj @@ -10,11 +10,6 @@ true - - - - - @@ -25,4 +20,8 @@ + + + + diff --git a/src/WebEncoders/test/Microsoft.Extensions.WebEncoders.Tests.csproj b/src/WebEncoders/test/Microsoft.Extensions.WebEncoders.Tests.csproj index 628f6fa66983..cdbc6167862e 100755 --- a/src/WebEncoders/test/Microsoft.Extensions.WebEncoders.Tests.csproj +++ b/src/WebEncoders/test/Microsoft.Extensions.WebEncoders.Tests.csproj @@ -7,8 +7,11 @@ - + + + + From a3c9983f7fce1e7e70d6ff9ec06ee0015861540c Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Thu, 9 Apr 2026 02:03:04 +0000 Subject: [PATCH 02/13] Update dependencies from build 309569 Updated Dependencies: Microsoft.NET.Runtime.WebAssembly.Sdk, Microsoft.NETCore.BrowserDebugHost.Transport, Microsoft.NET.Runtime.MonoAOTCompiler.Task, dotnet-ef, Microsoft.Bcl.AsyncInterfaces, Microsoft.Bcl.TimeProvider, Microsoft.EntityFrameworkCore, Microsoft.EntityFrameworkCore.Design, Microsoft.EntityFrameworkCore.InMemory, Microsoft.EntityFrameworkCore.Relational, Microsoft.EntityFrameworkCore.Sqlite, Microsoft.EntityFrameworkCore.SqlServer, Microsoft.EntityFrameworkCore.Tools, Microsoft.Extensions.Caching.Abstractions, Microsoft.Extensions.Caching.Memory, Microsoft.Extensions.Configuration, Microsoft.Extensions.Configuration.Abstractions, Microsoft.Extensions.Configuration.Binder, Microsoft.Extensions.Configuration.CommandLine, Microsoft.Extensions.Configuration.EnvironmentVariables, Microsoft.Extensions.Configuration.FileExtensions, Microsoft.Extensions.Configuration.Ini, Microsoft.Extensions.Configuration.Json, Microsoft.Extensions.Configuration.UserSecrets, Microsoft.Extensions.Configuration.Xml, Microsoft.Extensions.DependencyInjection, Microsoft.Extensions.DependencyInjection.Abstractions, Microsoft.Extensions.DependencyModel, Microsoft.Extensions.Diagnostics, Microsoft.Extensions.Diagnostics.Abstractions, Microsoft.Extensions.FileProviders.Abstractions, Microsoft.Extensions.FileProviders.Composite, Microsoft.Extensions.FileProviders.Physical, Microsoft.Extensions.FileSystemGlobbing, Microsoft.Extensions.HostFactoryResolver.Sources, Microsoft.Extensions.Hosting, Microsoft.Extensions.Hosting.Abstractions, Microsoft.Extensions.Http, Microsoft.Extensions.Logging, Microsoft.Extensions.Logging.Abstractions, Microsoft.Extensions.Logging.Configuration, Microsoft.Extensions.Logging.Console, Microsoft.Extensions.Logging.Debug, Microsoft.Extensions.Logging.EventLog, Microsoft.Extensions.Logging.EventSource, Microsoft.Extensions.Logging.TraceSource, Microsoft.Extensions.Options, Microsoft.Extensions.Options.ConfigurationExtensions, Microsoft.Extensions.Options.DataAnnotations, Microsoft.Extensions.Primitives, Microsoft.Internal.Runtime.AspNetCore.Transport, Microsoft.NETCore.App.Ref, Microsoft.NETCore.Platforms, System.Collections.Immutable, System.Composition, System.Configuration.ConfigurationManager, System.Diagnostics.DiagnosticSource, System.Diagnostics.EventLog, System.Diagnostics.PerformanceCounter, System.DirectoryServices.Protocols, System.Formats.Asn1, System.Formats.Cbor, System.IO.Hashing, System.IO.Pipelines, System.Memory.Data, System.Net.Http.Json, System.Net.Http.WinHttpHandler, System.Net.ServerSentEvents, System.Numerics.Tensors, System.Reflection.Metadata, System.Resources.Extensions, System.Runtime.Caching, System.Security.Cryptography.Pkcs, System.Security.Cryptography.Xml, System.Security.Permissions, System.ServiceProcess.ServiceController, System.Text.Encodings.Web, System.Text.Json, System.Threading.AccessControl, System.Threading.Channels, System.Threading.RateLimiting (Version 11.0.0-preview.4.26203.108 -> 11.0.0-preview.4.26208.110) Microsoft.DotNet.Arcade.Sdk, Microsoft.DotNet.Build.Tasks.Archives, Microsoft.DotNet.Build.Tasks.Installers, Microsoft.DotNet.Build.Tasks.Templating, Microsoft.DotNet.Helix.Sdk, Microsoft.DotNet.RemoteExecutor, Microsoft.DotNet.SharedFramework.Sdk (Version 11.0.0-beta.26203.108 -> 11.0.0-beta.26208.110) Microsoft.Web.Xdt (Version 3.3.0-preview.4.26203.108 -> 3.3.0-preview.4.26208.110) NuGet.Frameworks, NuGet.Packaging, NuGet.Versioning (Version 7.6.0-rc.20408 -> 7.6.0-rc.20910) [[ commit created by automation ]] --- NuGet.config | 1 - eng/Version.Details.props | 184 +++++++++---------- eng/Version.Details.xml | 370 +++++++++++++++++++------------------- eng/common/tools.ps1 | 2 +- eng/common/tools.sh | 2 +- global.json | 6 +- 6 files changed, 282 insertions(+), 283 deletions(-) diff --git a/NuGet.config b/NuGet.config index cecd386871cd..587ae4b8d5b9 100644 --- a/NuGet.config +++ b/NuGet.config @@ -4,7 +4,6 @@ - diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 5a3387aeab49..2f9fec48d5a6 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -6,98 +6,98 @@ This file should be imported by eng/Versions.props - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-beta.26203.108 - 11.0.0-beta.26203.108 - 11.0.0-beta.26203.108 - 11.0.0-beta.26203.108 - 11.0.0-beta.26203.108 - 11.0.0-beta.26203.108 - 11.0.0-beta.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 3.3.0-preview.4.26203.108 - 7.6.0-rc.20408 - 7.6.0-rc.20408 - 7.6.0-rc.20408 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 - 11.0.0-preview.4.26203.108 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-beta.26208.110 + 11.0.0-beta.26208.110 + 11.0.0-beta.26208.110 + 11.0.0-beta.26208.110 + 11.0.0-beta.26208.110 + 11.0.0-beta.26208.110 + 11.0.0-beta.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 3.3.0-preview.4.26208.110 + 7.6.0-rc.20910 + 7.6.0-rc.20910 + 7.6.0-rc.20910 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26208.110 10.4.1 10.4.1 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4194346b605f..edb7c917c253 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,333 +8,333 @@ See https://github.com/dotnet/arcade/blob/master/Documentation/Darc.md for instructions on using darc. --> - + - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 @@ -358,37 +358,37 @@ - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 https://github.com/dotnet/extensions @@ -440,17 +440,17 @@ https://github.com/dotnet/msbuild d1cce8d7cc03c23a4f1bad8e9240714fd9d199a3 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 - + https://github.com/dotnet/dotnet - 1a405c76db678301b6f6f5b22d2a63a152c26b97 + 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index c96f5018fe43..2b593af51cee 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -842,7 +842,7 @@ function MSBuild-Core() { $cmdArgs += ' /p:TreatWarningsAsErrors=false' } - if ($warnNotAsError) { + if ($warnAsError -and $warnNotAsError) { $cmdArgs += " /warnnotaserror:$warnNotAsError /p:AdditionalWarningsNotAsErrors=$warnNotAsError" } diff --git a/eng/common/tools.sh b/eng/common/tools.sh index a6e0ed594fda..80d2dbd0fe3d 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -534,7 +534,7 @@ function MSBuild-Core { fi local warnnotaserror_switch="" - if [[ -n "$warn_not_as_error" ]]; then + if [[ -n "$warn_not_as_error" && "$warn_as_error" == true ]]; then warnnotaserror_switch="/warnnotaserror:$warn_not_as_error /p:AdditionalWarningsNotAsErrors=$warn_not_as_error" fi diff --git a/global.json b/global.json index e131044b58d1..83ee2a1d223c 100644 --- a/global.json +++ b/global.json @@ -22,9 +22,9 @@ "jdk": "latest" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26203.108", - "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26203.108", - "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26203.108", + "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26208.110", + "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26208.110", + "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26208.110", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0", "Microsoft.WixToolset.Sdk": "5.0.2-dotnet.2811440" From 328cad5b5f9196906f9658a19064c264b69110c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Thu, 9 Apr 2026 11:14:47 +0200 Subject: [PATCH 03/13] Add feed back into NuGet.config --- NuGet.config | 1 + 1 file changed, 1 insertion(+) diff --git a/NuGet.config b/NuGet.config index 587ae4b8d5b9..cecd386871cd 100644 --- a/NuGet.config +++ b/NuGet.config @@ -4,6 +4,7 @@ + From c232fd28a8524ceb416ab05eb5823c50b9bf183a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Fri, 10 Apr 2026 21:27:22 +0000 Subject: [PATCH 04/13] Backflow from https://github.com/dotnet/dotnet / 5bed449 build 309901 [[ commit created by automation ]] --- .../community-pr-issue-check.lock.yml | 1171 +++++++++++++++++ .github/workflows/community-pr-issue-check.md | 76 ++ .vscode/mcp.json | 2 +- eng/tools/RepoTasks/RepoTasks.tasks | 2 +- .../Builder/ResourceCollectionUrlEndpoint.cs | 8 +- .../ResourceCollectionUrlEndpointTest.cs | 50 + .../test/E2ETest/Tests/VirtualizationTest.cs | 65 +- .../src/aspnetcore-runtime-composite.proj | 8 +- .../App.Runtime/src/aspnetcore-runtime.proj | 8 +- .../src/Matching/NegotiationMatcherPolicy.cs | 35 +- ...yIEndpointSelectorPolicyIntegrationTest.cs | 10 + ...PolicyINodeBuilderPolicyIntegrationTest.cs | 10 + ...tiationMatcherPolicyIntegrationTestBase.cs | 315 +++++ ...entEncodingNegotiationMatcherPolicyTest.cs | 237 ++++ .../WindowsHostingBundle/Product.targets | 8 +- .../src/ResponseCompressionBody.cs | 31 +- .../src/ResponseCompressionMiddleware.cs | 8 + .../test/ResponseCompressionMiddlewareTest.cs | 16 +- .../localize/templatestrings.cs.json | 2 +- .../localize/templatestrings.de.json | 2 +- .../localize/templatestrings.es.json | 2 +- .../localize/templatestrings.fr.json | 2 +- .../localize/templatestrings.it.json | 2 +- .../localize/templatestrings.ja.json | 2 +- .../localize/templatestrings.ko.json | 2 +- .../localize/templatestrings.pl.json | 2 +- .../localize/templatestrings.pt-BR.json | 2 +- .../localize/templatestrings.ru.json | 2 +- .../localize/templatestrings.tr.json | 2 +- .../localize/templatestrings.zh-Hans.json | 2 +- .../localize/templatestrings.zh-Hant.json | 2 +- .../src/Features/ITlsHandshakeFeature.cs | 8 + .../PublicAPI/net11.0/PublicAPI.Unshipped.txt | 1 + .../Core/src/Internal/TlsConnectionFeature.cs | 77 +- .../Middleware/HttpsConnectionMiddleware.cs | 17 +- .../Kestrel/samples/SampleApp/Startup.cs | 20 +- .../HttpsConnectionMiddlewareTests.cs | 101 ++ 37 files changed, 2226 insertions(+), 84 deletions(-) create mode 100644 .github/workflows/community-pr-issue-check.lock.yml create mode 100644 .github/workflows/community-pr-issue-check.md create mode 100644 src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyIEndpointSelectorPolicyIntegrationTest.cs create mode 100644 src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyINodeBuilderPolicyIntegrationTest.cs create mode 100644 src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyIntegrationTestBase.cs diff --git a/.github/workflows/community-pr-issue-check.lock.yml b/.github/workflows/community-pr-issue-check.lock.yml new file mode 100644 index 000000000000..4502174c70d3 --- /dev/null +++ b/.github/workflows/community-pr-issue-check.lock.yml @@ -0,0 +1,1171 @@ +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"5d2c80402496fddfbfe56c07c183fe876ad6866c078b22967cec94eefd4ad3a4","compiler_version":"v0.67.1","strict":true,"agent_id":"copilot"} +# ___ _ _ +# / _ \ | | (_) +# | |_| | __ _ ___ _ __ | |_ _ ___ +# | _ |/ _` |/ _ \ '_ \| __| |/ __| +# | | | | (_| | __/ | | | |_| | (__ +# \_| |_/\__, |\___|_| |_|\__|_|\___| +# __/ | +# _ _ |___/ +# | | | | / _| | +# | | | | ___ _ __ _ __| |_| | _____ ____ +# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| +# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ +# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ +# +# This file was automatically generated by gh-aw (v0.67.1). DO NOT EDIT. +# +# To update this file, edit the corresponding .md file and run: +# gh aw compile +# Not all edits will cause changes to this file. +# +# For more information: https://github.github.com/gh-aw/introduction/overview/ +# +# Check whether community contribution pull requests reference an associated issue in this repository and comment with contribution guidance when they do not. +# +# Secrets used: +# - COPILOT_GITHUB_TOKEN +# - GH_AW_GITHUB_MCP_SERVER_TOKEN +# - GH_AW_GITHUB_TOKEN +# - GITHUB_TOKEN +# +# Custom actions used: +# - actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 +# - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 +# - actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 +# - actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 +# - github/gh-aw-actions/setup@80471a493be8c528dd27daf73cd644242a7965e0 # v0.67.1 + +name: "Community PR Issue Check" +"on": + pull_request: + # forks: # Fork filtering applied via job conditions + # - "*" # Fork filtering applied via job conditions + # names: # Label filtering applied via job conditions + # - community-contribution # Label filtering applied via job conditions + types: + - labeled + +permissions: {} + +concurrency: + group: "gh-aw-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref || github.run_id }}" + cancel-in-progress: true + +run-name: "Community PR Issue Check" + +jobs: + activation: + needs: pre_activation + if: > + needs.pre_activation.outputs.activated == 'true' && (github.event_name != 'pull_request' || github.event.action != 'labeled' || + github.event.label.name == 'community-contribution') + runs-on: ubuntu-slim + permissions: + contents: read + outputs: + body: ${{ steps.sanitized.outputs.body }} + comment_id: "" + comment_repo: "" + lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }} + model: ${{ steps.generate_aw_info.outputs.model }} + secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + text: ${{ steps.sanitized.outputs.text }} + title: ${{ steps.sanitized.outputs.title }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@80471a493be8c528dd27daf73cd644242a7965e0 # v0.67.1 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.pre_activation.outputs.setup-trace-id }} + - name: Generate agentic run info + id: generate_aw_info + env: + GH_AW_INFO_ENGINE_ID: "copilot" + GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" + GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || 'auto' }} + GH_AW_INFO_VERSION: "latest" + GH_AW_INFO_AGENT_VERSION: "latest" + GH_AW_INFO_CLI_VERSION: "v0.67.1" + GH_AW_INFO_WORKFLOW_NAME: "Community PR Issue Check" + GH_AW_INFO_EXPERIMENTAL: "false" + GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" + GH_AW_INFO_STAGED: "false" + GH_AW_INFO_ALLOWED_DOMAINS: '["defaults"]' + GH_AW_INFO_FIREWALL_ENABLED: "true" + GH_AW_INFO_AWF_VERSION: "v0.25.13" + GH_AW_INFO_AWMG_VERSION: "" + GH_AW_INFO_FIREWALL_TYPE: "squid" + GH_AW_COMPILED_STRICT: "true" + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_aw_info.cjs'); + await main(core, context); + - name: Validate COPILOT_GITHUB_TOKEN secret + id: validate-secret + run: ${RUNNER_TEMP}/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default + env: + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + - name: Checkout .github and .agents folders + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + sparse-checkout: | + .github + .agents + sparse-checkout-cone-mode: true + fetch-depth: 1 + - name: Check workflow lock file + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_WORKFLOW_FILE: "community-pr-issue-check.lock.yml" + GH_AW_CONTEXT_WORKFLOW_REF: "${{ github.workflow_ref }}" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_workflow_timestamp_api.cjs'); + await main(); + - name: Check compile-agentic version + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_COMPILED_VERSION: "v0.67.1" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_version_updates.cjs'); + await main(); + - name: Compute current body text + id: sanitized + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/compute_text.cjs'); + await main(); + - name: Create prompt with built-in context + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ runner.temp }}/gh-aw/safeoutputs/outputs.jsonl + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + # poutine:ignore untrusted_checkout_exec + run: | + bash ${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh + { + cat << 'GH_AW_PROMPT_85a7f8c4b0d00eca_EOF' + + GH_AW_PROMPT_85a7f8c4b0d00eca_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" + cat << 'GH_AW_PROMPT_85a7f8c4b0d00eca_EOF' + + Tools: add_comment, missing_tool, missing_data, noop + + + The following GitHub context information is available for this workflow: + {{#if __GH_AW_GITHUB_ACTOR__ }} + - **actor**: __GH_AW_GITHUB_ACTOR__ + {{/if}} + {{#if __GH_AW_GITHUB_REPOSITORY__ }} + - **repository**: __GH_AW_GITHUB_REPOSITORY__ + {{/if}} + {{#if __GH_AW_GITHUB_WORKSPACE__ }} + - **workspace**: __GH_AW_GITHUB_WORKSPACE__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} + - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} + - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} + - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} + - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ + {{/if}} + {{#if __GH_AW_GITHUB_RUN_ID__ }} + - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ + {{/if}} + + + GH_AW_PROMPT_85a7f8c4b0d00eca_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" + cat << 'GH_AW_PROMPT_85a7f8c4b0d00eca_EOF' + + {{#runtime-import .github/workflows/community-pr-issue-check.md}} + GH_AW_PROMPT_85a7f8c4b0d00eca_EOF + } > "$GH_AW_PROMPT" + - name: Interpolate variables and render templates + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/interpolate_prompt.cjs'); + await main(); + - name: Substitute placeholders + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: ${{ needs.pre_activation.outputs.activated }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + + const substitutePlaceholders = require('${{ runner.temp }}/gh-aw/actions/substitute_placeholders.cjs'); + + // Call the substitution function + return await substitutePlaceholders({ + file: process.env.GH_AW_PROMPT, + substitutions: { + GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, + GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, + GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, + GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, + GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, + GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: process.env.GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED + } + }); + - name: Validate prompt placeholders + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + # poutine:ignore untrusted_checkout_exec + run: bash ${RUNNER_TEMP}/gh-aw/actions/validate_prompt_placeholders.sh + - name: Print prompt + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + # poutine:ignore untrusted_checkout_exec + run: bash ${RUNNER_TEMP}/gh-aw/actions/print_prompt_summary.sh + - name: Upload activation artifact + if: success() + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + with: + name: activation + path: | + /tmp/gh-aw/aw_info.json + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/github_rate_limits.jsonl + if-no-files-found: ignore + retention-days: 1 + + agent: + needs: activation + runs-on: ubuntu-latest + permissions: + contents: read + issues: read + pull-requests: read + env: + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + GH_AW_ASSETS_ALLOWED_EXTS: "" + GH_AW_ASSETS_BRANCH: "" + GH_AW_ASSETS_MAX_SIZE_KB: 0 + GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs + GH_AW_WORKFLOW_ID_SANITIZED: communityprissuecheck + outputs: + checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} + effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }} + has_patch: ${{ steps.collect_output.outputs.has_patch }} + inference_access_error: ${{ steps.detect-inference-error.outputs.inference_access_error || 'false' }} + model: ${{ needs.activation.outputs.model }} + output: ${{ steps.collect_output.outputs.output }} + output_types: ${{ steps.collect_output.outputs.output_types }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@80471a493be8c528dd27daf73cd644242a7965e0 # v0.67.1 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + - name: Set runtime paths + id: set-runtime-paths + run: | + echo "GH_AW_SAFE_OUTPUTS=${RUNNER_TEMP}/gh-aw/safeoutputs/outputs.jsonl" >> "$GITHUB_OUTPUT" + echo "GH_AW_SAFE_OUTPUTS_CONFIG_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" >> "$GITHUB_OUTPUT" + echo "GH_AW_SAFE_OUTPUTS_TOOLS_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/tools.json" >> "$GITHUB_OUTPUT" + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + - name: Create gh-aw temp directory + run: bash ${RUNNER_TEMP}/gh-aw/actions/create_gh_aw_tmp_dir.sh + - name: Configure gh CLI for GitHub Enterprise + run: bash ${RUNNER_TEMP}/gh-aw/actions/configure_gh_for_ghe.sh + env: + GH_TOKEN: ${{ github.token }} + - name: Configure Git credentials + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Checkout PR branch + id: checkout-pr + if: | + github.event.pull_request || github.event.issue.pull_request + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs'); + await main(); + - name: Install GitHub Copilot CLI + run: ${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh latest + env: + GH_HOST: github.com + - name: Install AWF binary + run: bash ${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh v0.25.13 + - name: Determine automatic lockdown mode for GitHub MCP Server + id: determine-automatic-lockdown + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + with: + script: | + const determineAutomaticLockdown = require('${{ runner.temp }}/gh-aw/actions/determine_automatic_lockdown.cjs'); + await determineAutomaticLockdown(github, context, core); + - name: Download container images + run: bash ${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh ghcr.io/github/gh-aw-firewall/agent:0.25.13 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.13 ghcr.io/github/gh-aw-firewall/squid:0.25.13 ghcr.io/github/gh-aw-mcpg:v0.2.14 ghcr.io/github/github-mcp-server:v0.32.0 node:lts-alpine + - name: Write Safe Outputs Config + run: | + mkdir -p ${RUNNER_TEMP}/gh-aw/safeoutputs + mkdir -p /tmp/gh-aw/safeoutputs + mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs + cat > ${RUNNER_TEMP}/gh-aw/safeoutputs/config.json << 'GH_AW_SAFE_OUTPUTS_CONFIG_3e770074e9ddf0f3_EOF' + {"add_comment":{"hide_older_comments":true,"max":1},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"false"},"report_incomplete":{}} + GH_AW_SAFE_OUTPUTS_CONFIG_3e770074e9ddf0f3_EOF + - name: Write Safe Outputs Tools + run: | + cat > ${RUNNER_TEMP}/gh-aw/safeoutputs/tools_meta.json << 'GH_AW_SAFE_OUTPUTS_TOOLS_META_c2f70d9424de077b_EOF' + { + "description_suffixes": { + "add_comment": " CONSTRAINTS: Maximum 1 comment(s) can be added." + }, + "repo_params": {}, + "dynamic_tools": [] + } + GH_AW_SAFE_OUTPUTS_TOOLS_META_c2f70d9424de077b_EOF + cat > ${RUNNER_TEMP}/gh-aw/safeoutputs/validation.json << 'GH_AW_SAFE_OUTPUTS_VALIDATION_ba067bb263b6926a_EOF' + { + "add_comment": { + "defaultMax": 1, + "fields": { + "body": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "item_number": { + "issueOrPRNumber": true + }, + "repo": { + "type": "string", + "maxLength": 256 + } + } + }, + "missing_data": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "context": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "data_type": { + "type": "string", + "sanitize": true, + "maxLength": 128 + }, + "reason": { + "type": "string", + "sanitize": true, + "maxLength": 256 + } + } + }, + "missing_tool": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 512 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "tool": { + "type": "string", + "sanitize": true, + "maxLength": 128 + } + } + }, + "noop": { + "defaultMax": 1, + "fields": { + "message": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + } + } + }, + "report_incomplete": { + "defaultMax": 5, + "fields": { + "details": { + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 1024 + } + } + } + } + GH_AW_SAFE_OUTPUTS_VALIDATION_ba067bb263b6926a_EOF + node ${RUNNER_TEMP}/gh-aw/actions/generate_safe_outputs_tools.cjs + - name: Generate Safe Outputs MCP Server Config + id: safe-outputs-config + run: | + # Generate a secure random API key (360 bits of entropy, 40+ chars) + # Mask immediately to prevent timing vulnerabilities + API_KEY=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${API_KEY}" + + PORT=3001 + + # Set outputs for next steps + { + echo "safe_outputs_api_key=${API_KEY}" + echo "safe_outputs_port=${PORT}" + } >> "$GITHUB_OUTPUT" + + echo "Safe Outputs MCP server will run on port ${PORT}" + + - name: Start Safe Outputs MCP HTTP Server + id: safe-outputs-start + env: + DEBUG: '*' + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }} + GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }} + GH_AW_SAFE_OUTPUTS_TOOLS_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/tools.json + GH_AW_SAFE_OUTPUTS_CONFIG_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/config.json + GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs + run: | + # Environment variables are set above to prevent template injection + export DEBUG + export GH_AW_SAFE_OUTPUTS + export GH_AW_SAFE_OUTPUTS_PORT + export GH_AW_SAFE_OUTPUTS_API_KEY + export GH_AW_SAFE_OUTPUTS_TOOLS_PATH + export GH_AW_SAFE_OUTPUTS_CONFIG_PATH + export GH_AW_MCP_LOG_DIR + + bash ${RUNNER_TEMP}/gh-aw/actions/start_safe_outputs_server.sh + + - name: Start MCP Gateway + id: start-mcp-gateway + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }} + GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }} + GITHUB_MCP_GUARD_MIN_INTEGRITY: ${{ steps.determine-automatic-lockdown.outputs.min_integrity }} + GITHUB_MCP_GUARD_REPOS: ${{ steps.determine-automatic-lockdown.outputs.repos }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + run: | + set -eo pipefail + mkdir -p /tmp/gh-aw/mcp-config + + # Export gateway environment variables for MCP config and gateway script + export MCP_GATEWAY_PORT="80" + export MCP_GATEWAY_DOMAIN="host.docker.internal" + MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${MCP_GATEWAY_API_KEY}" + export MCP_GATEWAY_API_KEY + export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" + mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" + export MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD="524288" + export DEBUG="*" + + export GH_AW_ENGINE="copilot" + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.2.14' + + mkdir -p /home/runner/.copilot + cat << GH_AW_MCP_CONFIG_1f799c611dfe5f0e_EOF | bash ${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.sh + { + "mcpServers": { + "github": { + "type": "stdio", + "container": "ghcr.io/github/github-mcp-server:v0.32.0", + "env": { + "GITHUB_HOST": "\${GITHUB_SERVER_URL}", + "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", + "GITHUB_READ_ONLY": "1", + "GITHUB_TOOLSETS": "issues,pull_requests" + }, + "guard-policies": { + "allow-only": { + "min-integrity": "$GITHUB_MCP_GUARD_MIN_INTEGRITY", + "repos": "$GITHUB_MCP_GUARD_REPOS" + } + } + }, + "safeoutputs": { + "type": "http", + "url": "http://host.docker.internal:$GH_AW_SAFE_OUTPUTS_PORT", + "headers": { + "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}" + }, + "guard-policies": { + "write-sink": { + "accept": [ + "*" + ] + } + } + } + }, + "gateway": { + "port": $MCP_GATEWAY_PORT, + "domain": "${MCP_GATEWAY_DOMAIN}", + "apiKey": "${MCP_GATEWAY_API_KEY}", + "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" + } + } + GH_AW_MCP_CONFIG_1f799c611dfe5f0e_EOF + - name: Download activation artifact + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: activation + path: /tmp/gh-aw + - name: Clean git credentials + continue-on-error: true + run: bash ${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh + - name: Execute GitHub Copilot CLI + id: agentic_execution + # Copilot CLI tool arguments (sorted): + timeout-minutes: 20 + run: | + set -o pipefail + touch /tmp/gh-aw/agent-step-summary.md + # shellcheck disable=SC1003 + sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --image-tag 0.25.13 --skip-pull --enable-api-proxy \ + -- /bin/bash -c '/usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log + env: + COPILOT_AGENT_RUNNER_TYPE: STANDALONE + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + COPILOT_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || '' }} + GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json + GH_AW_PHASE: agent + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_VERSION: v0.67.1 + GITHUB_API_URL: ${{ github.api_url }} + GITHUB_AW: true + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_REF_NAME: ${{ github.ref_name }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md + GITHUB_WORKSPACE: ${{ github.workspace }} + GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_AUTHOR_NAME: github-actions[bot] + GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_COMMITTER_NAME: github-actions[bot] + XDG_CONFIG_HOME: /home/runner + - name: Detect inference access error + id: detect-inference-error + if: always() + continue-on-error: true + run: bash ${RUNNER_TEMP}/gh-aw/actions/detect_inference_access_error.sh + - name: Configure Git credentials + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Copy Copilot session state files to logs + if: always() + continue-on-error: true + run: bash ${RUNNER_TEMP}/gh-aw/actions/copy_copilot_session_state.sh + - name: Stop MCP Gateway + if: always() + continue-on-error: true + env: + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} + GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} + run: | + bash ${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh "$GATEWAY_PID" + - name: Redact secrets in logs + if: always() + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/redact_secrets.cjs'); + await main(); + env: + GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN' + SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Append agent step summary + if: always() + run: bash ${RUNNER_TEMP}/gh-aw/actions/append_agent_step_summary.sh + - name: Copy Safe Outputs + if: always() + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + run: | + mkdir -p /tmp/gh-aw + cp "$GH_AW_SAFE_OUTPUTS" /tmp/gh-aw/safeoutputs.jsonl 2>/dev/null || true + - name: Ingest agent output + id: collect_output + if: always() + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/collect_ndjson_output.cjs'); + await main(); + - name: Parse agent logs for step summary + if: always() + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_copilot_log.cjs'); + await main(); + - name: Parse MCP Gateway logs for step summary + if: always() + id: parse-mcp-gateway + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_mcp_gateway_log.cjs'); + await main(); + - name: Print firewall logs + if: always() + continue-on-error: true + env: + AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs + run: | + # Fix permissions on firewall logs so they can be uploaded as artifacts + # AWF runs with sudo, creating files owned by root + sudo chmod -R a+r /tmp/gh-aw/sandbox/firewall/logs 2>/dev/null || true + # Only run awf logs summary if awf command exists (it may not be installed if workflow failed before install step) + if command -v awf &> /dev/null; then + awf logs summary | tee -a "$GITHUB_STEP_SUMMARY" + else + echo 'AWF binary not installed, skipping firewall log summary' + fi + - name: Parse token usage for step summary + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_token_usage.cjs'); + await main(); + - name: Write agent output placeholder if missing + if: always() + run: | + if [ ! -f /tmp/gh-aw/agent_output.json ]; then + echo '{"items":[]}' > /tmp/gh-aw/agent_output.json + fi + - name: Upload agent artifacts + if: always() + continue-on-error: true + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + with: + name: agent + path: | + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/sandbox/agent/logs/ + /tmp/gh-aw/redacted-urls.log + /tmp/gh-aw/mcp-logs/ + /tmp/gh-aw/agent_usage.json + /tmp/gh-aw/agent-stdio.log + /tmp/gh-aw/agent/ + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/safeoutputs.jsonl + /tmp/gh-aw/agent_output.json + /tmp/gh-aw/aw-*.patch + /tmp/gh-aw/aw-*.bundle + if-no-files-found: ignore + - name: Upload firewall audit logs + if: always() + continue-on-error: true + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + with: + name: firewall-audit-logs + path: | + /tmp/gh-aw/sandbox/firewall/logs/ + /tmp/gh-aw/sandbox/firewall/audit/ + if-no-files-found: ignore + + conclusion: + needs: + - activation + - agent + - detection + - safe_outputs + if: always() && (needs.agent.result != 'skipped' || needs.activation.outputs.lockdown_check_failed == 'true') + runs-on: ubuntu-slim + permissions: + contents: read + discussions: write + issues: write + pull-requests: write + concurrency: + group: "gh-aw-conclusion-community-pr-issue-check" + cancel-in-progress: false + outputs: + incomplete_count: ${{ steps.report_incomplete.outputs.incomplete_count }} + noop_message: ${{ steps.noop.outputs.noop_message }} + tools_reported: ${{ steps.missing_tool.outputs.tools_reported }} + total_count: ${{ steps.missing_tool.outputs.total_count }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@80471a493be8c528dd27daf73cd644242a7965e0 # v0.67.1 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Process No-Op Messages + id: noop + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_NOOP_MAX: "1" + GH_AW_WORKFLOW_NAME: "Community PR Issue Check" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_NOOP_REPORT_AS_ISSUE: "false" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_noop_message.cjs'); + await main(); + - name: Record Missing Tool + id: missing_tool + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_MISSING_TOOL_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "Community PR Issue Check" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/missing_tool.cjs'); + await main(); + - name: Record Incomplete + id: report_incomplete + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "Community PR Issue Check" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/report_incomplete_handler.cjs'); + await main(); + - name: Handle Agent Failure + id: handle_agent_failure + if: always() + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_WORKFLOW_NAME: "Community PR Issue Check" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_WORKFLOW_ID: "community-pr-issue-check" + GH_AW_ENGINE_ID: "copilot" + GH_AW_SECRET_VERIFICATION_RESULT: ${{ needs.activation.outputs.secret_verification_result }} + GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} + GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }} + GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }} + GH_AW_GROUP_REPORTS: "false" + GH_AW_FAILURE_REPORT_AS_ISSUE: "true" + GH_AW_TIMEOUT_MINUTES: "20" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); + await main(); + + detection: + needs: + - activation + - agent + if: > + always() && needs.agent.result != 'skipped' && (needs.agent.outputs.output_types != '' || needs.agent.outputs.has_patch == 'true') + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + detection_conclusion: ${{ steps.detection_conclusion.outputs.conclusion }} + detection_success: ${{ steps.detection_conclusion.outputs.success }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@80471a493be8c528dd27daf73cd644242a7965e0 # v0.67.1 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Checkout repository for patch context + if: needs.agent.outputs.has_patch == 'true' + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + # --- Threat Detection --- + - name: Download container images + run: bash ${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh ghcr.io/github/gh-aw-firewall/agent:0.25.13 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.13 ghcr.io/github/gh-aw-firewall/squid:0.25.13 + - name: Check if detection needed + id: detection_guard + if: always() + env: + OUTPUT_TYPES: ${{ needs.agent.outputs.output_types }} + HAS_PATCH: ${{ needs.agent.outputs.has_patch }} + run: | + if [[ -n "$OUTPUT_TYPES" || "$HAS_PATCH" == "true" ]]; then + echo "run_detection=true" >> "$GITHUB_OUTPUT" + echo "Detection will run: output_types=$OUTPUT_TYPES, has_patch=$HAS_PATCH" + else + echo "run_detection=false" >> "$GITHUB_OUTPUT" + echo "Detection skipped: no agent outputs or patches to analyze" + fi + - name: Clear MCP configuration for detection + if: always() && steps.detection_guard.outputs.run_detection == 'true' + run: | + rm -f /tmp/gh-aw/mcp-config/mcp-servers.json + rm -f /home/runner/.copilot/mcp-config.json + rm -f "$GITHUB_WORKSPACE/.gemini/settings.json" + - name: Prepare threat detection files + if: always() && steps.detection_guard.outputs.run_detection == 'true' + run: | + mkdir -p /tmp/gh-aw/threat-detection/aw-prompts + cp /tmp/gh-aw/aw-prompts/prompt.txt /tmp/gh-aw/threat-detection/aw-prompts/prompt.txt 2>/dev/null || true + cp /tmp/gh-aw/agent_output.json /tmp/gh-aw/threat-detection/agent_output.json 2>/dev/null || true + for f in /tmp/gh-aw/aw-*.patch; do + [ -f "$f" ] && cp "$f" /tmp/gh-aw/threat-detection/ 2>/dev/null || true + done + for f in /tmp/gh-aw/aw-*.bundle; do + [ -f "$f" ] && cp "$f" /tmp/gh-aw/threat-detection/ 2>/dev/null || true + done + echo "Prepared threat detection files:" + ls -la /tmp/gh-aw/threat-detection/ 2>/dev/null || true + - name: Setup threat detection + if: always() && steps.detection_guard.outputs.run_detection == 'true' + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + WORKFLOW_NAME: "Community PR Issue Check" + WORKFLOW_DESCRIPTION: "Check whether community contribution pull requests reference an associated issue in this repository and comment with contribution guidance when they do not." + HAS_PATCH: ${{ needs.agent.outputs.has_patch }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/setup_threat_detection.cjs'); + await main(); + - name: Ensure threat-detection directory and log + if: always() && steps.detection_guard.outputs.run_detection == 'true' + run: | + mkdir -p /tmp/gh-aw/threat-detection + touch /tmp/gh-aw/threat-detection/detection.log + - name: Install GitHub Copilot CLI + run: ${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh latest + env: + GH_HOST: github.com + - name: Install AWF binary + run: bash ${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh v0.25.13 + - name: Execute GitHub Copilot CLI + if: always() && steps.detection_guard.outputs.run_detection == 'true' + id: detection_agentic_execution + # Copilot CLI tool arguments (sorted): + timeout-minutes: 20 + run: | + set -o pipefail + touch /tmp/gh-aw/agent-step-summary.md + # shellcheck disable=SC1003 + sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,github.com,host.docker.internal,telemetry.enterprise.githubcopilot.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --image-tag 0.25.13 --skip-pull --enable-api-proxy \ + -- /bin/bash -c '/usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --allow-all-tools --add-dir "${GITHUB_WORKSPACE}" --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"' 2>&1 | tee -a /tmp/gh-aw/threat-detection/detection.log + env: + COPILOT_AGENT_RUNNER_TYPE: STANDALONE + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + COPILOT_MODEL: ${{ vars.GH_AW_MODEL_DETECTION_COPILOT || '' }} + GH_AW_PHASE: detection + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_VERSION: v0.67.1 + GITHUB_API_URL: ${{ github.api_url }} + GITHUB_AW: true + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_REF_NAME: ${{ github.ref_name }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md + GITHUB_WORKSPACE: ${{ github.workspace }} + GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_AUTHOR_NAME: github-actions[bot] + GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_COMMITTER_NAME: github-actions[bot] + XDG_CONFIG_HOME: /home/runner + - name: Upload threat detection log + if: always() && steps.detection_guard.outputs.run_detection == 'true' + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + with: + name: detection + path: /tmp/gh-aw/threat-detection/detection.log + if-no-files-found: ignore + - name: Parse and conclude threat detection + id: detection_conclusion + if: always() + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_threat_detection_results.cjs'); + await main(); + + pre_activation: + if: > + github.event_name != 'pull_request' || github.event.action != 'labeled' || github.event.label.name == 'community-contribution' + runs-on: ubuntu-slim + outputs: + activated: ${{ steps.check_membership.outputs.is_team_member == 'true' }} + matched_command: '' + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@80471a493be8c528dd27daf73cd644242a7965e0 # v0.67.1 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + - name: Check team membership for workflow + id: check_membership + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_REQUIRED_ROLES: "admin,maintainer,write" + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_membership.cjs'); + await main(); + + safe_outputs: + needs: + - activation + - agent + - detection + if: (!cancelled()) && needs.agent.result != 'skipped' && needs.detection.result == 'success' + runs-on: ubuntu-slim + permissions: + contents: read + discussions: write + issues: write + pull-requests: write + timeout-minutes: 15 + env: + GH_AW_CALLER_WORKFLOW_ID: "${{ github.repository }}/community-pr-issue-check" + GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }} + GH_AW_ENGINE_ID: "copilot" + GH_AW_ENGINE_MODEL: ${{ needs.agent.outputs.model }} + GH_AW_WORKFLOW_ID: "community-pr-issue-check" + GH_AW_WORKFLOW_NAME: "Community PR Issue Check" + outputs: + code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} + code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} + create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} + create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} + process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@80471a493be8c528dd27daf73cd644242a7965e0 # v0.67.1 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Configure GH_HOST for enterprise compatibility + id: ghes-host-config + shell: bash + run: | + # Derive GH_HOST from GITHUB_SERVER_URL so the gh CLI targets the correct + # GitHub instance (GHES/GHEC). On github.com this is a harmless no-op. + GH_HOST="${GITHUB_SERVER_URL#https://}" + GH_HOST="${GH_HOST#http://}" + echo "GH_HOST=${GH_HOST}" >> "$GITHUB_ENV" + - name: Process Safe Outputs + id: process_safe_outputs + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"hide_older_comments\":true,\"max\":1},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/safe_output_handler_manager.cjs'); + await main(); + - name: Upload Safe Output Items + if: always() + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + with: + name: safe-output-items + path: /tmp/gh-aw/safe-output-items.jsonl + if-no-files-found: ignore + diff --git a/.github/workflows/community-pr-issue-check.md b/.github/workflows/community-pr-issue-check.md new file mode 100644 index 000000000000..2710927ebe00 --- /dev/null +++ b/.github/workflows/community-pr-issue-check.md @@ -0,0 +1,76 @@ +--- +on: + pull_request: + types: [labeled] + names: [community-contribution] + forks: ["*"] + +description: > + Check whether community contribution pull requests reference an associated + issue in this repository and comment with contribution guidance when they do not. + +permissions: + contents: read + issues: read + pull-requests: read + +tools: + github: + toolsets: [issues, pull_requests] + +safe-outputs: + noop: + report-as-issue: false + add-comment: + hide-older-comments: true +--- + +# Community PR Issue Check + +You are reviewing pull request #${{ github.event.pull_request.number }} in +`${{ github.repository }}`. This pull request has been labeled +`community-contribution`. + +Your task is to determine whether the PR body references a related GitHub issue +in this repository. This is required by the repository's contribution policy. + +## Instructions + +1. Read the body of pull request #${{ github.event.pull_request.number }} using + the GitHub pull request tools. + +2. Look for references to GitHub issues in `${{ github.repository }}`. + Consider these examples as valid formats: + - Keyword-linked references such as `Fixes #123`, `Closes #123`, + `Resolves #123`, `Addresses #123`, or `Related to #123` + - Direct URL references such as + `https://github.com/${{ github.repository }}/issues/123` + - Plain `#123` references when the surrounding text clearly indicates the PR + is associated with that issue + +3. For each candidate reference you find, verify through the GitHub issue tools + that the referenced number is an issue in `${{ github.repository }}` and not + a pull request. + +4. If at least one valid repository issue reference exists, use the `noop` safe + output with a short message explaining that the PR already references a valid + issue. + +5. If no valid repository issue reference exists, use the `add-comment` safe + output to post this exact comment on the pull request: + + 👋 Hi there, thanks for your contribution! + + Community pull requests in `${{ github.repository }}` need to have an associated issue before we can review them. + + Please update the pull request description to link the issue. For example: Fixes #123 + + If an issue does not exist yet, please open one first: https://github.com/${{ github.repository }}/issues/new/choose + + For more details, see: + - https://github.com/${{ github.repository }}/blob/main/CONTRIBUTING.md + - https://github.com/${{ github.repository }}/blob/main/.github/pull_request_template.md + +6. Do not modify labels, do not edit the pull request body, and do not analyze + code changes. Only determine whether there is an associated issue reference + and comment when one is missing. diff --git a/.vscode/mcp.json b/.vscode/mcp.json index 3812a04e2bbb..daff2e4f55a4 100644 --- a/.vscode/mcp.json +++ b/.vscode/mcp.json @@ -7,7 +7,7 @@ "@playwright/mcp@latest" ] }, - "microsoft.docs.mcp": { + "microsoft-docs-mcp": { "type": "http", "url": "https://learn.microsoft.com/api/mcp" } diff --git a/eng/tools/RepoTasks/RepoTasks.tasks b/eng/tools/RepoTasks/RepoTasks.tasks index d558037d1978..ece4b4424379 100644 --- a/eng/tools/RepoTasks/RepoTasks.tasks +++ b/eng/tools/RepoTasks/RepoTasks.tasks @@ -1,4 +1,5 @@ + <_RepoTaskAssemblyFolder Condition="'$(MSBuildRuntimeType)' == 'core'">net11.0 <_RepoTaskAssemblyFolder Condition="'$(MSBuildRuntimeType)' != 'core'">net472 @@ -9,5 +10,4 @@ - diff --git a/src/Components/Endpoints/src/Builder/ResourceCollectionUrlEndpoint.cs b/src/Components/Endpoints/src/Builder/ResourceCollectionUrlEndpoint.cs index ef9e066228de..94fcef6a3465 100644 --- a/src/Components/Endpoints/src/Builder/ResourceCollectionUrlEndpoint.cs +++ b/src/Components/Endpoints/src/Builder/ResourceCollectionUrlEndpoint.cs @@ -82,9 +82,11 @@ private static string ComputeIntegrity(byte[] bytes) private static byte[] CreateGzipBytes(byte[] bytes) { using var gzipContent = new MemoryStream(); - using var gzipStream = new GZipStream(gzipContent, CompressionLevel.Optimal, leaveOpen: true); - gzipStream.Write(bytes); - gzipStream.Flush(); + using (var gzipStream = new GZipStream(gzipContent, CompressionLevel.Optimal, leaveOpen: true)) + { + gzipStream.Write(bytes); + } + return gzipContent.ToArray(); } diff --git a/src/Components/Endpoints/test/Builder/ResourceCollectionUrlEndpointTest.cs b/src/Components/Endpoints/test/Builder/ResourceCollectionUrlEndpointTest.cs index ae8266dcc61e..c1ba90b611d1 100644 --- a/src/Components/Endpoints/test/Builder/ResourceCollectionUrlEndpointTest.cs +++ b/src/Components/Endpoints/test/Builder/ResourceCollectionUrlEndpointTest.cs @@ -1,6 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.IO.Compression; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing; + namespace Microsoft.AspNetCore.Components.Endpoints; public class ResourceCollectionUrlEndpointTest @@ -194,4 +198,50 @@ public void ComputeFingerprintSuffix_ChangesWhenNonFingerprintedAssetIntegrityCh // Assert - Fingerprint must be different to ensure browser fetches updated resource-collection.js Assert.NotEqual(fingerprintSuffix1, fingerprintSuffix2); } + + [Fact] + public async Task MapResourceCollectionEndpoints_GzipEndpointReturnsCompleteGzipPayload() + { + var endpoints = new List(); + var collection = new ResourceAssetCollection( + [ + new("/_framework/app.dll", + [ + new("integrity", "sha256-OriginalHash123456") + ]) + ]); + + ResourceCollectionUrlEndpoint.MapResourceCollectionEndpoints( + endpoints, + "_framework/resource-collection{0}.js{1}", + collection); + + var gzipEndpoint = Assert.Single(endpoints.OfType(), endpoint => endpoint.RoutePattern.RawText == "_framework/resource-collection.js.gz"); + var contentEndpoint = Assert.Single( + endpoints.OfType(), + endpoint => endpoint.RoutePattern.RawText == "_framework/resource-collection.js" && + endpoint.Metadata.GetMetadata() is null); + + var gzipContext = new DefaultHttpContext(); + await using var gzipResponseBody = new MemoryStream(); + gzipContext.Response.Body = gzipResponseBody; + + await gzipEndpoint.RequestDelegate!(gzipContext); + + gzipResponseBody.Position = 0; + await using var decompressedBody = new MemoryStream(); + await using (var gzipStream = new GZipStream(gzipResponseBody, CompressionMode.Decompress, leaveOpen: true)) + { + await gzipStream.CopyToAsync(decompressedBody); + } + + var contentContext = new DefaultHttpContext(); + await using var contentResponseBody = new MemoryStream(); + contentContext.Response.Body = contentResponseBody; + + await contentEndpoint.RequestDelegate!(contentContext); + + Assert.Equal("gzip", gzipContext.Response.Headers.ContentEncoding); + Assert.Equal(contentResponseBody.ToArray(), decompressedBody.ToArray()); + } } diff --git a/src/Components/test/E2ETest/Tests/VirtualizationTest.cs b/src/Components/test/E2ETest/Tests/VirtualizationTest.cs index 0408382380dc..bc0560a65671 100644 --- a/src/Components/test/E2ETest/Tests/VirtualizationTest.cs +++ b/src/Components/test/E2ETest/Tests/VirtualizationTest.cs @@ -740,6 +740,41 @@ private static void ScrollLeftToEnd(IWebDriver Browser, IWebElement elem) js.ExecuteScript("arguments[0].scrollLeft = arguments[0].scrollWidth", elem); } + private void ScrollToOffsetWithStabilization( + IWebElement container, + double targetScrollTop, + int minFirstRenderedIndexExclusive) + { + var js = (IJavaScriptExecutor)Browser; + + container.Click(); + Browser.True(() => + { + js.ExecuteScript("arguments[0].scrollTop = arguments[1];", container, targetScrollTop); + + var currentScrollTop = Convert.ToDouble( + js.ExecuteScript("return arguments[0].scrollTop;", container), + CultureInfo.InvariantCulture); + if (currentScrollTop + 1 < targetScrollTop) + { + return false; + } + + var items = container.FindElements(By.CssSelector(".item")); + if (items.Count == 0) + { + return false; + } + + var indexText = items.First().GetDomAttribute("data-index"); + return indexText != null + && int.TryParse(indexText, NumberStyles.Integer, CultureInfo.InvariantCulture, out var index) + && index > minFirstRenderedIndexExclusive; + }); + + WaitForScrollStabilization(container); + } + /// /// Jumps to end using a single End key press, then waits for scroll position to stabilize. /// With the measurement-based scroll compensation in Virtualize, a single End press converges @@ -1043,20 +1078,7 @@ public void DynamicContent_PrependItemsWhileScrolledToMiddle_VisibleItemsStayInP Browser.True(() => GetElementCount(container, ".item") > 0); // Scroll past the overscan window to force true virtualization. - js.ExecuteScript("arguments[0].scrollTop = 5000", container); - Browser.True(() => (long)js.ExecuteScript("return arguments[0].scrollTop", container) >= 5000); - - Browser.True(() => - { - var items = container.FindElements(By.CssSelector(".item")); - if (items.Count == 0) - { - return false; - } - - var idx = items.First().GetDomAttribute("data-index"); - return idx != null && int.Parse(idx, CultureInfo.InvariantCulture) > 10; - }); + ScrollToOffsetWithStabilization(container, targetScrollTop: 5000, minFirstRenderedIndexExclusive: 10); // Record the first visible item and its Y position. var containerRect = container.Location; @@ -1107,20 +1129,7 @@ public void DynamicContent_AppendItemsWhileScrolledToMiddle_VisibleItemsStayInPl Browser.True(() => GetElementCount(container, ".item") > 0); // Scroll past the overscan window to force true virtualization. - js.ExecuteScript("arguments[0].scrollTop = 5000", container); - Browser.True(() => (long)js.ExecuteScript("return arguments[0].scrollTop", container) >= 5000); - - Browser.True(() => - { - var items = container.FindElements(By.CssSelector(".item")); - if (items.Count == 0) - { - return false; - } - - var idx = items.First().GetDomAttribute("data-index"); - return idx != null && int.Parse(idx, CultureInfo.InvariantCulture) > 10; - }); + ScrollToOffsetWithStabilization(container, targetScrollTop: 5000, minFirstRenderedIndexExclusive: 10); var visibleItems = container.FindElements(By.CssSelector(".item")); var firstVisible = visibleItems.First(); var firstVisibleIndex = firstVisible.GetDomAttribute("data-index"); diff --git a/src/Framework/App.Runtime/src/aspnetcore-runtime-composite.proj b/src/Framework/App.Runtime/src/aspnetcore-runtime-composite.proj index ece2092f05aa..4ccb457dd2e3 100644 --- a/src/Framework/App.Runtime/src/aspnetcore-runtime-composite.proj +++ b/src/Framework/App.Runtime/src/aspnetcore-runtime-composite.proj @@ -31,14 +31,16 @@ $(BaseIntermediateOutputPath)$(DotNetRuntimeArchiveFileName) + - + diff --git a/src/Framework/App.Runtime/src/aspnetcore-runtime.proj b/src/Framework/App.Runtime/src/aspnetcore-runtime.proj index c58fc8eb3cef..f44a4d3cf9b0 100644 --- a/src/Framework/App.Runtime/src/aspnetcore-runtime.proj +++ b/src/Framework/App.Runtime/src/aspnetcore-runtime.proj @@ -34,14 +34,16 @@ $(BaseIntermediateOutputPath)$(DotNetRuntimeArchiveFileName) + - + diff --git a/src/Http/Routing/src/Matching/NegotiationMatcherPolicy.cs b/src/Http/Routing/src/Matching/NegotiationMatcherPolicy.cs index c6670eace440..e2adbd53d8d4 100644 --- a/src/Http/Routing/src/Matching/NegotiationMatcherPolicy.cs +++ b/src/Http/Routing/src/Matching/NegotiationMatcherPolicy.cs @@ -93,8 +93,16 @@ public Task ApplyAsync(HttpContext httpContext, CandidateSet candidates) var sawCandidateWithoutMetadata = false; var sawValidCandidate = false; var bestMatchIndex = -1; + var bestMatchScore = -1; var bestQualitySoFar = 0.0; var bestEndpointQualitySoFar = 0.0; + // Track where the current score tier starts. Since candidates are sorted by ascending score, + // all candidates in [0, scoreTierStart) have a strictly lower score than candidates in the current tier. + // This lets us bound backward sweeps in EvaluateCandidate without per-element score comparisons. + // currentTierScore tracks the score value in a separate variable because SetValidity bitwise-negates + // the Score field, which would corrupt a tier-boundary check that reads candidates[scoreTierStart].Score. + var scoreTierStart = 0; + var currentTierScore = int.MinValue; for (var i = 0; i < candidates.Count; i++) { if (!candidates.IsValidCandidate(i)) @@ -105,6 +113,15 @@ public Task ApplyAsync(HttpContext httpContext, CandidateSet candidates) sawValidCandidate = true; + // candidates[i].Score is always non-negative here (candidate is valid). + // Since candidates are sorted by ascending score, a new score value means a new tier. + var candidateScore = candidates[i].Score; + if (candidateScore != currentTierScore) + { + scoreTierStart = i; + currentTierScore = candidateScore; + } + ref var candidate = ref candidates[i]; var metadata = GetMetadataValue(candidate.Endpoint); if (metadata is null) @@ -120,7 +137,8 @@ public Task ApplyAsync(HttpContext httpContext, CandidateSet candidates) if (MemoryExtensions.Equals(metadata.AsSpan(), value.Value.AsSpan(), StringComparison.OrdinalIgnoreCase)) { found = true; - EvaluateCandidate(candidates, ref bestMatchIndex, ref bestQualitySoFar, ref bestEndpointQualitySoFar, i, value); + EvaluateCandidate(candidates, ref bestMatchIndex, ref bestQualitySoFar, ref bestEndpointQualitySoFar, i, scoreTierStart, value); + bestMatchScore = candidates[bestMatchIndex].Score; break; } } @@ -129,6 +147,13 @@ public Task ApplyAsync(HttpContext httpContext, CandidateSet candidates) { // We already have at least a candidate, and the default value was not part of the header, so we won't be considering it // at a later stage as a fallback. + // However, don't invalidate candidates with strictly better routing priority (lower score) than the current best match. + // Since candidates are sorted by ascending score, once i reaches the best match's score tier, + // all subsequent candidates have equal or worse priority. + if (bestMatchIndex >= 0 && candidates[i].Score < bestMatchScore) + { + continue; + } candidates.SetValidity(i, false); } } @@ -150,6 +175,7 @@ private void EvaluateCandidate( ref double bestQualitySoFar, ref double bestEndpointQualitySoFar, int currentIndex, + int scoreTierStart, StringWithQualityHeaderValue value) { var quality = value.Quality ?? 1.0; @@ -161,7 +187,10 @@ private void EvaluateCandidate( bestEndpointQualitySoFar = GetMetadataQuality(candidates[currentIndex].Endpoint) ?? 1.0; // Since we found a better match, we can invalidate all the candidates from the current position to the new one. - for (var j = bestMatchIndex; j < currentIndex; j++) + // Only invalidate within the same score tier — candidates before scoreTierStart have strictly + // better routing priority and represent different resources that should not be eliminated by + // encoding preference. Since candidates are sorted by ascending score, this is a simple bound. + for (var j = Math.Max(bestMatchIndex, scoreTierStart); j < currentIndex; j++) { candidates.SetValidity(j, false); } @@ -181,7 +210,7 @@ private void EvaluateCandidate( if ((endpointQuality - bestEndpointQualitySoFar) > double.Epsilon) { // Since we found a better match, we can invalidate all the candidates from the current position to the new one. - for (var j = bestMatchIndex; j < currentIndex; j++) + for (var j = Math.Max(bestMatchIndex, scoreTierStart); j < currentIndex; j++) { candidates.SetValidity(j, false); } diff --git a/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyIEndpointSelectorPolicyIntegrationTest.cs b/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyIEndpointSelectorPolicyIntegrationTest.cs new file mode 100644 index 000000000000..49ca1300ab9b --- /dev/null +++ b/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyIEndpointSelectorPolicyIntegrationTest.cs @@ -0,0 +1,10 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Routing.Matching; + +// End-to-end tests for the content encoding negotiation matching functionality (IEndpointSelectorPolicy path) +public class ContentEncodingNegotiationMatcherPolicyIEndpointSelectorPolicyIntegrationTest : ContentEncodingNegotiationMatcherPolicyIntegrationTestBase +{ + protected override bool HasDynamicMetadata => true; +} diff --git a/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyINodeBuilderPolicyIntegrationTest.cs b/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyINodeBuilderPolicyIntegrationTest.cs new file mode 100644 index 000000000000..e2772c52790e --- /dev/null +++ b/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyINodeBuilderPolicyIntegrationTest.cs @@ -0,0 +1,10 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Routing.Matching; + +// End-to-end tests for the content encoding negotiation matching functionality (INodeBuilderPolicy path) +public class ContentEncodingNegotiationMatcherPolicyINodeBuilderPolicyIntegrationTest : ContentEncodingNegotiationMatcherPolicyIntegrationTestBase +{ + protected override bool HasDynamicMetadata => false; +} diff --git a/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyIntegrationTestBase.cs b/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyIntegrationTestBase.cs new file mode 100644 index 000000000000..41fac6ca703a --- /dev/null +++ b/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyIntegrationTestBase.cs @@ -0,0 +1,315 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing.Patterns; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.Routing.Matching; + +// End-to-end tests for the content encoding negotiation matching functionality +public abstract class ContentEncodingNegotiationMatcherPolicyIntegrationTestBase +{ + protected abstract bool HasDynamicMetadata { get; } + + [Fact] + public async Task Match_ContentEncoding_SelectsEndpointWithMatchingEncoding() + { + // Arrange + var gzipEndpoint = CreateEndpoint("/hello", contentEncoding: "gzip"); + var identityEndpoint = CreateEndpoint("/hello"); + + var matcher = CreateMatcher(gzipEndpoint, identityEndpoint); + var httpContext = CreateContext("/hello", "gzip"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert + MatcherAssert.AssertMatch(httpContext, gzipEndpoint); + } + + [Fact] + public async Task Match_ContentEncoding_SelectsIdentityEndpoint_WhenEncodingNotInAcceptHeader() + { + // Arrange + var gzipEndpoint = CreateEndpoint("/hello", contentEncoding: "gzip"); + var identityEndpoint = CreateEndpoint("/hello"); + + var matcher = CreateMatcher(gzipEndpoint, identityEndpoint); + var httpContext = CreateContext("/hello", "br"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert + MatcherAssert.AssertMatch(httpContext, identityEndpoint); + } + + [Fact] + public async Task Match_ContentEncoding_SelectsHigherAcceptQuality() + { + // Arrange + var gzipEndpoint = CreateEndpoint("/hello", contentEncoding: "gzip"); + var brEndpoint = CreateEndpoint("/hello", contentEncoding: "br"); + + var matcher = CreateMatcher(gzipEndpoint, brEndpoint); + var httpContext = CreateContext("/hello", "gzip;q=0.5, br;q=1.0"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert + MatcherAssert.AssertMatch(httpContext, brEndpoint); + } + + [Fact] + public async Task Match_ContentEncoding_SelectsHigherEndpointQuality_WhenAcceptQualityEqual() + { + // Arrange + var gzipEndpoint = CreateEndpoint("/hello", contentEncoding: "gzip", quality: 0.9); + var brEndpoint = CreateEndpoint("/hello", contentEncoding: "br", quality: 0.5); + + var matcher = CreateMatcher(gzipEndpoint, brEndpoint); + var httpContext = CreateContext("/hello", "gzip, br"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert + MatcherAssert.AssertMatch(httpContext, gzipEndpoint); + } + + [Fact] + public async Task Match_ContentEncoding_AcceptQualityWins_WhenBothAcceptAndEndpointQualityDiffer() + { + // Arrange — Accept quality takes precedence over endpoint quality (the tie-breaker). + // Both endpoints have the same endpoint quality (equal server preference). + // The client's Accept-Encoding header assigns different qualities to each encoding. + // Even though endpoint quality would be used as a tie-breaker when Accept qualities are equal, + // here the Accept quality difference dictates the selection. + var gzipEndpoint = CreateEndpoint("/hello", contentEncoding: "gzip", quality: 0.9); + var brEndpoint = CreateEndpoint("/hello", contentEncoding: "br", quality: 0.9); + + var matcher = CreateMatcher(gzipEndpoint, brEndpoint); + var httpContext = CreateContext("/hello", "gzip;q=0.3, br;q=0.9"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert — br has higher Accept quality (0.9 > 0.3), so br is selected. + MatcherAssert.AssertMatch(httpContext, brEndpoint); + } + + [Fact] + public async Task Match_LiteralEndpointPreserved_WhenCatchAllHasEncodingMetadata() + { + // Arrange - This is the core scenario for the priority fix: + // A literal endpoint without encoding metadata must not be invalidated + // by a catch-all with encoding metadata. + var literalEndpoint = CreateEndpoint("/hello"); + var catchAllGzip = CreateEndpoint("/{**path}", contentEncoding: "gzip"); + + var matcher = CreateMatcher(literalEndpoint, catchAllGzip); + var httpContext = CreateContext("/hello", "gzip, br"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert - literal endpoint wins by route priority despite not matching gzip + MatcherAssert.AssertMatch(httpContext, literalEndpoint); + } + + [Fact] + public async Task Match_LiteralEndpointPreserved_WhenCatchAllHasMultipleEncodingVariants() + { + // Arrange - Simulates MapStaticAssets: catch-all has identity, gzip, and br variants. + // The literal endpoint must survive. + var literalEndpoint = CreateEndpoint("/hello"); + var catchAllIdentity = CreateEndpoint("/{**path}"); + var catchAllGzip = CreateEndpoint("/{**path}", contentEncoding: "gzip"); + var catchAllBr = CreateEndpoint("/{**path}", contentEncoding: "br"); + + var matcher = CreateMatcher(literalEndpoint, catchAllIdentity, catchAllGzip, catchAllBr); + var httpContext = CreateContext("/hello", "gzip, br"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert - literal wins by route priority + MatcherAssert.AssertMatch(httpContext, literalEndpoint); + } + + [Fact] + public async Task Match_ParameterizedEndpointPreserved_WhenCatchAllHasEncodingMetadata() + { + // Arrange + var paramEndpoint = CreateEndpoint("/hello/{name}"); + var catchAllGzip = CreateEndpoint("/{**path}", contentEncoding: "gzip"); + + var matcher = CreateMatcher(paramEndpoint, catchAllGzip); + var httpContext = CreateContext("/hello/world", "gzip"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert - parameterized endpoint wins by route priority + MatcherAssert.AssertMatch(httpContext, paramEndpoint, new { name = "world" }); + } + + [Fact] + public async Task Match_MixedPriorities_LiteralWinsOverParameterizedAndCatchAll() + { + // Arrange - Multiple priority tiers: + // /literal/path (exact, no metadata) + // /literal/{param} (parameterized, no metadata) + // {**catchall} gzip (catch-all with encoding metadata) + var literalEndpoint = CreateEndpoint("/literal/path"); + var paramEndpoint = CreateEndpoint("/literal/{param}"); + var catchAllGzip = CreateEndpoint("/{**path}", contentEncoding: "gzip"); + + var matcher = CreateMatcher(literalEndpoint, paramEndpoint, catchAllGzip); + var httpContext = CreateContext("/literal/path", "gzip, br"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert - literal wins (highest priority) + MatcherAssert.AssertMatch(httpContext, literalEndpoint); + } + + [Fact] + public async Task Match_EncodingNegotiationWorksWithinSamePriority() + { + // Arrange - Two variants of the same resource at the same route priority. + // Encoding negotiation should still pick the best encoding. + var gzipEndpoint = CreateEndpoint("/hello", contentEncoding: "gzip", quality: 0.8); + var identityEndpoint = CreateEndpoint("/hello"); + + var matcher = CreateMatcher(gzipEndpoint, identityEndpoint); + var httpContext = CreateContext("/hello", "gzip"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert - gzip wins (encoding match within same priority) + MatcherAssert.AssertMatch(httpContext, gzipEndpoint); + } + + [Fact] + public async Task Match_StaticFileEncodingVariants_CatchAllDoesNotInterfere() + { + // Arrange - Simulates a static file with encoding variants plus a catch-all: + // /style.css identity (no metadata) + // /style.css gzip (gzip metadata) + // {**path} gzip (catch-all with gzip) + var styleIdentity = CreateEndpoint("/style.css"); + var styleGzip = CreateEndpoint("/style.css", contentEncoding: "gzip", quality: 0.8); + var catchAllGzip = CreateEndpoint("/{**path}", contentEncoding: "gzip", quality: 0.8); + + var matcher = CreateMatcher(styleIdentity, styleGzip, catchAllGzip); + var httpContext = CreateContext("/style.css", "gzip"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert - style.css gzip wins (same priority as identity, better encoding match) + MatcherAssert.AssertMatch(httpContext, styleGzip); + } + + [Fact] + public async Task Match_CatchAllSelected_WhenNoHigherPriorityMatch() + { + // Arrange - Request to a path that only matches the catch-all. + // Encoding negotiation should work normally. + var literalEndpoint = CreateEndpoint("/hello"); + var catchAllGzip = CreateEndpoint("/{**path}", contentEncoding: "gzip"); + var catchAllIdentity = CreateEndpoint("/{**path}"); + + var matcher = CreateMatcher(literalEndpoint, catchAllGzip, catchAllIdentity); + var httpContext = CreateContext("/other", "gzip"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert - catch-all gzip wins (only catch-all matches this path) + MatcherAssert.AssertMatch(httpContext, catchAllGzip, new { path = "other" }); + } + + [Fact] + public async Task Match_Returns406_WhenNoEndpointMatchesEncoding_AndNoIdentityFallback() + { + // Arrange - Only encoded variants exist, none match the Accept-Encoding. + var gzipEndpoint = CreateEndpoint("/hello", contentEncoding: "gzip"); + var brEndpoint = CreateEndpoint("/hello", contentEncoding: "br"); + + var matcher = CreateMatcher(gzipEndpoint, brEndpoint); + var httpContext = CreateContext("/hello", "zstd"); + + // Act + await matcher.MatchAsync(httpContext); + + // Assert - 406 endpoint is selected (no match, no identity fallback) + Assert.NotNull(httpContext.GetEndpoint()); + Assert.Equal(NegotiationMatcherPolicy.Http406EndpointDisplayName, httpContext.GetEndpoint().DisplayName); + } + + private static Matcher CreateMatcher(params RouteEndpoint[] endpoints) + { + var services = new ServiceCollection() + .AddOptions() + .AddLogging() + .AddRouting() + .BuildServiceProvider(); + + var builder = services.GetRequiredService(); + for (var i = 0; i < endpoints.Length; i++) + { + builder.AddEndpoint(endpoints[i]); + } + + return builder.Build(); + } + + internal static HttpContext CreateContext(string path, string acceptEncoding) + { + var httpContext = new DefaultHttpContext(); + httpContext.Request.Path = path; + httpContext.Request.Headers["Accept-Encoding"] = acceptEncoding; + + return httpContext; + } + + internal RouteEndpoint CreateEndpoint( + string template, + object defaults = null, + object constraints = null, + int order = 0, + string contentEncoding = null, + double quality = 1.0) + { + var metadata = new List(); + if (contentEncoding != null) + { + metadata.Add(new ContentEncodingMetadata(contentEncoding, quality)); + } + + if (HasDynamicMetadata) + { + metadata.Add(new DynamicEndpointMetadata()); + } + + var displayName = "endpoint: " + template + " " + (contentEncoding ?? "identity") + " q=" + quality; + return new RouteEndpoint( + TestConstants.EmptyRequestDelegate, + RoutePatternFactory.Parse(template, defaults, constraints), + order, + new EndpointMetadataCollection(metadata), + displayName); + } + + private class DynamicEndpointMetadata : IDynamicEndpointMetadata + { + public bool IsDynamic => true; + } +} diff --git a/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyTest.cs b/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyTest.cs index 9b9954343ebb..3140225b311f 100644 --- a/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyTest.cs +++ b/src/Http/Routing/test/UnitTests/Matching/ContentEncodingNegotiationMatcherPolicyTest.cs @@ -626,11 +626,248 @@ private static ContentEncodingNegotiationMatcherPolicy.NegotiationPolicyJumpTabl return (ContentEncodingNegotiationMatcherPolicy.NegotiationPolicyJumpTable)table; } + [Fact] + public async Task ApplyAsync_PreservesHigherPriorityEndpoint_WhenLowerPriorityEndpointMatchesEncoding() + { + // Arrange - simulates config endpoint (score=0, no encoding) vs catch-all (score=1, gzip) + var policy = new ContentEncodingNegotiationMatcherPolicy(); + var configEndpoint = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "Config"); + var catchAllGzip = CreateEndpoint("gzip"); + var endpoints = CreateCandidateSet( + new[] { configEndpoint, catchAllGzip }, + new[] { 0, 1 }); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers["Accept-Encoding"] = "gzip, br"; + + // Act + await policy.ApplyAsync(httpContext, endpoints); + + // Assert - config endpoint must survive despite not matching gzip + Assert.True(endpoints.IsValidCandidate(0)); + Assert.True(endpoints.IsValidCandidate(1)); + Assert.Null(httpContext.GetEndpoint()); + } + + [Fact] + public async Task ApplyAsync_PreservesHigherPriorityEndpoint_WhenLowerPriorityEndpointMatchesEncoding_MultipleEncodings() + { + // Arrange - config (score=0) + identity catch-all (score=1) + gzip catch-all (score=1) + br catch-all (score=1) + var policy = new ContentEncodingNegotiationMatcherPolicy(); + var configEndpoint = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "Config"); + var catchAllIdentity = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "CatchAll-Identity"); + var catchAllGzip = CreateEndpoint("gzip"); + var catchAllBr = CreateEndpoint("br"); + var endpoints = CreateCandidateSet( + new[] { configEndpoint, catchAllIdentity, catchAllGzip, catchAllBr }, + new[] { 0, 1, 1, 1 }); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers["Accept-Encoding"] = "gzip, br"; + + // Act + await policy.ApplyAsync(httpContext, endpoints); + + // Assert - config preserved, encoding negotiation works among same-score candidates + Assert.True(endpoints.IsValidCandidate(0)); + Assert.False(endpoints.IsValidCandidate(1)); // identity catch-all — invalidated by gzip match + Assert.True(endpoints.IsValidCandidate(2)); // gzip match + Assert.False(endpoints.IsValidCandidate(3)); // br — invalidated (gzip matched first with same quality) + Assert.Null(httpContext.GetEndpoint()); + } + + [Fact] + public async Task ApplyAsync_InvalidatesSamePriorityEndpoints_WhenEncodingMatches() + { + // Arrange - both at same score: identity and gzip variants of the same resource + var policy = new ContentEncodingNegotiationMatcherPolicy(); + var identity = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "Resource-Identity"); + var gzip = CreateEndpoint("gzip"); + var endpoints = CreateCandidateSet( + new[] { identity, gzip }, + new[] { 0, 0 }); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers["Accept-Encoding"] = "gzip"; + + // Act + await policy.ApplyAsync(httpContext, endpoints); + + // Assert - same priority, encoding wins + Assert.False(endpoints.IsValidCandidate(0)); + Assert.True(endpoints.IsValidCandidate(1)); + } + + [Fact] + public async Task ApplyAsync_PreservesHigherPriorityEndpoint_StaticFileAndCatchAll() + { + // Arrange - simulates: style.css(gzip,score=0) + style.css(identity,score=0) + catch-all(gzip,score=1) + var policy = new ContentEncodingNegotiationMatcherPolicy(); + var styleGzip = CreateEndpoint("gzip", 0.8); + var styleIdentity = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "style.css-identity"); + var catchAllGzip = CreateEndpoint("gzip", 0.8); + var endpoints = CreateCandidateSet( + new[] { styleGzip, styleIdentity, catchAllGzip }, + new[] { 0, 0, 1 }); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers["Accept-Encoding"] = "gzip"; + + // Act + await policy.ApplyAsync(httpContext, endpoints); + + // Assert - style.css gzip wins, identity invalidated (same score), catchall invalidated (lost quality tie) + Assert.True(endpoints.IsValidCandidate(0)); + Assert.False(endpoints.IsValidCandidate(1)); + Assert.False(endpoints.IsValidCandidate(2)); + } + + [Fact] + public async Task ApplyAsync_PreservesHigherPriorityEndpoint_HigherQualityEqualTie() + { + // Arrange - tests the equal-quality branch in EvaluateCandidate with higher endpoint quality + var policy = new ContentEncodingNegotiationMatcherPolicy(); + var configEndpoint = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "Config"); + var gzipLowQuality = CreateEndpoint("gzip", 0.5); + var gzipHighQuality = CreateEndpoint("gzip", 0.9); + var endpoints = CreateCandidateSet( + new[] { configEndpoint, gzipLowQuality, gzipHighQuality }, + new[] { 0, 1, 1 }); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers["Accept-Encoding"] = "gzip"; + + // Act + await policy.ApplyAsync(httpContext, endpoints); + + // Assert - config preserved (higher priority), gzip high quality wins among same-score + Assert.True(endpoints.IsValidCandidate(0)); // config preserved by priority + Assert.False(endpoints.IsValidCandidate(1)); // lower quality gzip invalidated + Assert.True(endpoints.IsValidCandidate(2)); // higher quality gzip wins + } + + [Fact] + public async Task ApplyAsync_PreservesHigherPriority_MetadataOnIntermediateEndpoint() + { + // Encoding metadata is on a mid-priority endpoint, not the lowest-priority catch-all. + // Higher-priority literal and lower-priority catch-all both lack metadata. + // /literal/path Score=0 (no metadata) + // /literal/{param} gzip Score=1 (gzip metadata) + // {**catchall} Score=2 (no metadata) + var policy = new ContentEncodingNegotiationMatcherPolicy(); + var literal = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "/literal/path"); + var paramGzip = CreateEndpoint("gzip", 0.9); + var catchAll = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "{**catchall}"); + var endpoints = CreateCandidateSet( + new[] { literal, paramGzip, catchAll }, + new[] { 0, 1, 2 }); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers["Accept-Encoding"] = "gzip, br"; + + // Act + await policy.ApplyAsync(httpContext, endpoints); + + // Assert + Assert.True(endpoints.IsValidCandidate(0)); // /literal/path preserved (Score=0 < bestMatchScore=1) + Assert.True(endpoints.IsValidCandidate(1)); // gzip matched at Score=1 + Assert.False(endpoints.IsValidCandidate(2)); // {**catchall} invalidated (Score=2 >= bestMatchScore, no match) + } + + [Fact] + public async Task ApplyAsync_PreservesHigherPriority_DifferentMetadataValuesSameTier() + { + // Multiple endpoints with different encoding values at the same score tier. + // Gzip wins over br by endpoint quality. Higher-priority literal preserved. + // /literal/path Score=0 (no metadata) + // /{param}/path gzip 0.9 Score=1 (gzip, higher endpoint quality) + // /{param}/path br 0.7 Score=1 (br, lower endpoint quality) + // {**catchall} Score=2 (no metadata) + var policy = new ContentEncodingNegotiationMatcherPolicy(); + var literal = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "/literal/path"); + var paramGzip = CreateEndpoint("gzip", 0.9); + var paramBr = CreateEndpoint("br", 0.7); + var catchAll = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "{**catchall}"); + var endpoints = CreateCandidateSet( + new[] { literal, paramGzip, paramBr, catchAll }, + new[] { 0, 1, 1, 2 }); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers["Accept-Encoding"] = "gzip, br"; + + // Act + await policy.ApplyAsync(httpContext, endpoints); + + // Assert + Assert.True(endpoints.IsValidCandidate(0)); // /literal/path preserved (Score=0) + Assert.True(endpoints.IsValidCandidate(1)); // gzip wins (endpoint quality 0.9 > 0.7) + Assert.False(endpoints.IsValidCandidate(2)); // br loses endpoint quality tie + Assert.False(endpoints.IsValidCandidate(3)); // {**catchall} invalidated (no match, Score=2) + } + + [Fact] + public async Task ApplyAsync_PreservesHigherPriority_MetadataAtMultipleScoreTiers() + { + // Encoding metadata at two different score tiers. The lower-priority tier matches with higher + // Accept quality, but the higher-priority match must still survive. + // /literal/path Score=0 (no metadata) + // /literal/{param} gzip Score=1 (gzip, endpoint quality 0.9) + // {param}/{param2} br Score=2 (br, endpoint quality 0.8) + // {**catchall} gzip Score=3 (gzip, endpoint quality 0.7) + // Accept-Encoding: gzip;q=0.5, br;q=1.0 + // → gzip at Score=1 matches first (Accept q=0.5), then br at Score=2 beats it (Accept q=1.0). + // → But Score=1 must survive because it has better routing priority than the new best at Score=2. + var policy = new ContentEncodingNegotiationMatcherPolicy(); + var literal = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "/literal/path"); + var paramGzip = CreateEndpoint("gzip", 0.9); + var param2Br = CreateEndpoint("br", 0.8); + var catchAllGzip = CreateEndpoint("gzip", 0.7); + var endpoints = CreateCandidateSet( + new[] { literal, paramGzip, param2Br, catchAllGzip }, + new[] { 0, 1, 2, 3 }); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers["Accept-Encoding"] = "gzip;q=0.5, br;q=1.0"; + + // Act + await policy.ApplyAsync(httpContext, endpoints); + + // Assert - Score=0 and Score=1 both preserved (better priority than bestMatch at Score=2) + Assert.True(endpoints.IsValidCandidate(0)); // /literal/path preserved (Score=0) + Assert.True(endpoints.IsValidCandidate(1)); // gzip preserved (Score=1, was previous best) + Assert.True(endpoints.IsValidCandidate(2)); // br wins (highest Accept quality at Score=2) + Assert.False(endpoints.IsValidCandidate(3)); // catch-all gzip invalidated (lower Accept quality) + } + + [Fact] + public async Task ApplyAsync_InvalidatesLowerPriority_WhenMetadataAtHighestPriority() + { + // No regression: when the encoding match is at the highest priority, lower-priority + // endpoints should still be invalidated normally. + // /literal/path gzip Score=0 (gzip metadata — highest priority) + // /literal/{param} Score=1 (no metadata) + // {**catchall} Score=2 (no metadata) + var policy = new ContentEncodingNegotiationMatcherPolicy(); + var literalGzip = CreateEndpoint("gzip"); + var param = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "/literal/{param}"); + var catchAll = new Endpoint(_ => Task.CompletedTask, new EndpointMetadataCollection(), "{**catchall}"); + var endpoints = CreateCandidateSet( + new[] { literalGzip, param, catchAll }, + new[] { 0, 1, 2 }); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Headers["Accept-Encoding"] = "gzip"; + + // Act + await policy.ApplyAsync(httpContext, endpoints); + + // Assert — gzip at highest priority wins, everything else invalidated + Assert.True(endpoints.IsValidCandidate(0)); // gzip matched at Score=0 + Assert.False(endpoints.IsValidCandidate(1)); // invalidated (no match, Score=1 >= bestMatchScore=0) + Assert.False(endpoints.IsValidCandidate(2)); // invalidated (no match, Score=2 >= bestMatchScore=0) + } + private static CandidateSet CreateCandidateSet(params Endpoint[] endpoints) => new( endpoints, endpoints.Select(e => new RouteValueDictionary()).ToArray(), endpoints.Select(e => 1).ToArray()); + private static CandidateSet CreateCandidateSet(Endpoint[] endpoints, int[] scores) => new( + endpoints, + endpoints.Select(e => new RouteValueDictionary()).ToArray(), + scores); + private static Endpoint CreateEndpoint(string contentEncoding, double quality = 1.0d) { var endpoint = new Endpoint( diff --git a/src/Installers/Windows/WindowsHostingBundle/Product.targets b/src/Installers/Windows/WindowsHostingBundle/Product.targets index c4c54cae812d..e03ca6109b46 100644 --- a/src/Installers/Windows/WindowsHostingBundle/Product.targets +++ b/src/Installers/Windows/WindowsHostingBundle/Product.targets @@ -75,6 +75,7 @@ + @@ -85,9 +86,10 @@ - + diff --git a/src/Middleware/ResponseCompression/src/ResponseCompressionBody.cs b/src/Middleware/ResponseCompression/src/ResponseCompressionBody.cs index 2eefdb6482b8..671c81231043 100644 --- a/src/Middleware/ResponseCompression/src/ResponseCompressionBody.cs +++ b/src/Middleware/ResponseCompression/src/ResponseCompressionBody.cs @@ -196,15 +196,18 @@ public override async ValueTask WriteAsync(ReadOnlyMemory buffer, Cancella } /// - /// Checks if the response should be compressed and sets the response headers. + /// Examines the response on first write to see if compression should be used and if true sets the Vary Accept-Encoding header. /// - /// The compression provider to use if compression is enabled, otherwise null. - private ICompressionProvider? InitializeCompressionHeaders() + /// current response compression provider + /// The . + /// if the response should be compressed, otherwise . + internal static bool ShouldCompressResponseCommon(IResponseCompressionProvider provider, HttpContext context) { - if (_provider.ShouldCompressResponse(_context)) + var result = provider.ShouldCompressResponse(context); + + if (result) { - var headers = _context.Response.Headers; - // If the MIME type indicates that the response could be compressed, caches will need to vary by the Accept-Encoding header + var headers = context.Response.Headers; var varyValues = headers.GetCommaSeparatedValues(HeaderNames.Vary); var varyByAcceptEncoding = false; @@ -219,10 +222,22 @@ public override async ValueTask WriteAsync(ReadOnlyMemory buffer, Cancella if (!varyByAcceptEncoding) { - // Can't use += as StringValues does not override operator+ - // and the implict conversions will cause an incorrect string concat https://github.com/dotnet/runtime/issues/52507 headers.Vary = StringValues.Concat(headers.Vary, HeaderNames.AcceptEncoding); } + } + + return result; + } + + /// + /// Checks if the response should be compressed and sets the response headers. + /// + /// The compression provider to use if compression is enabled, otherwise null. + private ICompressionProvider? InitializeCompressionHeaders() + { + if (ShouldCompressResponseCommon(_provider, _context)) + { + var headers = _context.Response.Headers; var compressionProvider = ResolveCompressionProvider(); if (compressionProvider != null) diff --git a/src/Middleware/ResponseCompression/src/ResponseCompressionMiddleware.cs b/src/Middleware/ResponseCompression/src/ResponseCompressionMiddleware.cs index 22a9677d6e10..519c508f5187 100644 --- a/src/Middleware/ResponseCompression/src/ResponseCompressionMiddleware.cs +++ b/src/Middleware/ResponseCompression/src/ResponseCompressionMiddleware.cs @@ -38,11 +38,19 @@ public Task Invoke(HttpContext context) { if (!_provider.CheckRequestAcceptsCompression(context)) { + var originalResponseFeature = context.Features.GetRequiredFeature(); + originalResponseFeature.OnStarting(OnStartingResponseHandler, context); return _next(context); } return InvokeCore(context); } + private async Task OnStartingResponseHandler(object state) + { + HttpContext context = (HttpContext)state; + ResponseCompressionBody.ShouldCompressResponseCommon(_provider, context); + } + private async Task InvokeCore(HttpContext context) { var originalBodyFeature = context.Features.Get(); diff --git a/src/Middleware/ResponseCompression/test/ResponseCompressionMiddlewareTest.cs b/src/Middleware/ResponseCompression/test/ResponseCompressionMiddlewareTest.cs index 4f1d1def09fc..156ad4ae22a3 100644 --- a/src/Middleware/ResponseCompression/test/ResponseCompressionMiddlewareTest.cs +++ b/src/Middleware/ResponseCompression/test/ResponseCompressionMiddlewareTest.cs @@ -41,12 +41,14 @@ public void Options_HttpsDisabledByDefault() } [Fact] - public async Task Request_NoAcceptEncoding_Uncompressed() + public async Task Request_NoAcceptEncoding_Uncompressed_WithVaryHeader() { var (response, logMessages) = await InvokeMiddleware(100, requestAcceptEncodings: null, responseType: TextPlain); - CheckResponseNotCompressed(response, expectedBodyLength: 100, sendVaryHeader: false); - AssertLog(logMessages.Single(), LogLevel.Debug, "No response compression available, the Accept-Encoding header is missing or invalid."); + CheckResponseNotCompressed(response, expectedBodyLength: 100, sendVaryHeader: true); + Assert.Equal(2, logMessages.Count); + AssertLog(logMessages.First(), LogLevel.Debug, "No response compression available, the Accept-Encoding header is missing or invalid."); + AssertLog(logMessages.Skip(1).First(), LogLevel.Trace, "Response compression is available for this Content-Type."); } [Fact] @@ -132,12 +134,14 @@ public async Task Request_AcceptUnknown_NotCompressed() } [Fact] - public async Task RequestHead_NoAcceptEncoding_Uncompressed() + public async Task RequestHead_NoAcceptEncoding_Uncompressed_WithVaryHeader() { var (response, logMessages) = await InvokeMiddleware(100, requestAcceptEncodings: null, responseType: TextPlain, httpMethod: HttpMethods.Head); - CheckResponseNotCompressed(response, expectedBodyLength: 100, sendVaryHeader: false); - AssertLog(logMessages.Single(), LogLevel.Debug, "No response compression available, the Accept-Encoding header is missing or invalid."); + CheckResponseNotCompressed(response, expectedBodyLength: 100, sendVaryHeader: true); + Assert.Equal(2, logMessages.Count); + AssertLog(logMessages.First(), LogLevel.Debug, "No response compression available, the Accept-Encoding header is missing or invalid."); + AssertLog(logMessages.Skip(1).First(), LogLevel.Trace, "Response compression is available for this Content-Type."); } [Fact] diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.cs.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.cs.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.cs.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.de.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.de.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.de.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.es.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.es.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.es.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.fr.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.fr.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.fr.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.it.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.it.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.it.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ja.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ja.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ja.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ko.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ko.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ko.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.pl.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.pl.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.pl.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.pt-BR.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.pt-BR.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.pt-BR.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ru.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ru.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.ru.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.tr.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.tr.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.tr.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.zh-Hans.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.zh-Hans.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.zh-Hans.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.zh-Hant.json index bf0c9ca06543..8c691d213dc9 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.zh-Hant.json +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWebWorker-CSharp/.template.config/localize/templatestrings.zh-Hant.json @@ -1,4 +1,4 @@ -{ +{ "author": "Microsoft", "name": "Blazor Web Worker", "description": "A project for creating a class library that runs .NET code on a web worker from a Blazor WebAssembly or Blazor Web app.", diff --git a/src/Servers/Connections.Abstractions/src/Features/ITlsHandshakeFeature.cs b/src/Servers/Connections.Abstractions/src/Features/ITlsHandshakeFeature.cs index 2ae3411d79c6..d2c585b9d658 100644 --- a/src/Servers/Connections.Abstractions/src/Features/ITlsHandshakeFeature.cs +++ b/src/Servers/Connections.Abstractions/src/Features/ITlsHandshakeFeature.cs @@ -82,4 +82,12 @@ public interface ITlsHandshakeFeature [Obsolete(Obsoletions.RuntimeTlsCipherAlgorithmEnumsMessage, DiagnosticId = Obsoletions.RuntimeTlsCipherAlgorithmEnumsDiagId, UrlFormat = Obsoletions.RuntimeSharedUrlFormat)] #endif int KeyExchangeStrength { get; } + +#if NET11_0_OR_GREATER + /// + /// Gets the exception that occurred during the TLS handshake, if any. + /// if the handshake succeeded or has not yet completed. + /// + Exception? Exception => null; +#endif } diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/net11.0/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/net11.0/PublicAPI.Unshipped.txt index 7dc5c58110bf..240766703d58 100644 --- a/src/Servers/Connections.Abstractions/src/PublicAPI/net11.0/PublicAPI.Unshipped.txt +++ b/src/Servers/Connections.Abstractions/src/PublicAPI/net11.0/PublicAPI.Unshipped.txt @@ -1 +1,2 @@ #nullable enable +Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.Exception.get -> System.Exception? diff --git a/src/Servers/Kestrel/Core/src/Internal/TlsConnectionFeature.cs b/src/Servers/Kestrel/Core/src/Internal/TlsConnectionFeature.cs index 2e16b0042715..051d5c510d08 100644 --- a/src/Servers/Kestrel/Core/src/Internal/TlsConnectionFeature.cs +++ b/src/Servers/Kestrel/Core/src/Internal/TlsConnectionFeature.cs @@ -16,9 +16,23 @@ internal sealed class TlsConnectionFeature : ITlsConnectionFeature, ITlsApplicat { private readonly SslStream _sslStream; private readonly ConnectionContext _context; + private bool _snapshotted; + private X509Certificate2? _clientCert; private Task? _clientCertTask; + private SslProtocols _protocol; + private TlsCipherSuite? _negotiatedCipherSuite; + private ReadOnlyMemory _applicationProtocol; +#pragma warning disable SYSLIB0058 // Obsolete TLS cipher algorithm enums + private CipherAlgorithmType _cipherAlgorithm; + private int _cipherStrength; + private HashAlgorithmType _hashAlgorithm; + private int _hashStrength; + private ExchangeAlgorithmType _keyExchangeAlgorithm; + private int _keyExchangeStrength; +#pragma warning restore SYSLIB0058 + public TlsConnectionFeature(SslStream sslStream, ConnectionContext context) { ArgumentNullException.ThrowIfNull(sslStream); @@ -28,6 +42,47 @@ public TlsConnectionFeature(SslStream sslStream, ConnectionContext context) _context = context; } + /// + /// Captures all SslStream-backed property values so they remain accessible after the SslStream is disposed. + /// Must be called before disposing the SslStream. + /// + internal void Snapshot() + { + if (_snapshotted) + { + return; + } + _snapshotted = true; + + if (_sslStream is null) + { + return; + } + + try + { + _protocol = _sslStream.SslProtocol; + _negotiatedCipherSuite = _sslStream.NegotiatedCipherSuite; + _applicationProtocol = _sslStream.NegotiatedApplicationProtocol.Protocol.ToArray(); + +#pragma warning disable SYSLIB0058 // Obsolete TLS cipher algorithm enums + _cipherAlgorithm = _sslStream.CipherAlgorithm; + _cipherStrength = _sslStream.CipherStrength; + _hashAlgorithm = _sslStream.HashAlgorithm; + _hashStrength = _sslStream.HashStrength; + _keyExchangeAlgorithm = _sslStream.KeyExchangeAlgorithm; + _keyExchangeStrength = _sslStream.KeyExchangeStrength; +#pragma warning restore SYSLIB0058 + + _clientCert ??= ConvertToX509Certificate2(_sslStream.RemoteCertificate); + } + catch + { + // If the handshake never completed, SslStream properties may throw. + // The snapshotted fields will retain their default values. + } + } + internal bool AllowDelayedClientCertificateNegotation { get; set; } public X509Certificate2? ClientCertificate @@ -45,33 +100,35 @@ public X509Certificate2? ClientCertificate public string HostName { get; set; } = string.Empty; - public ReadOnlyMemory ApplicationProtocol => _sslStream.NegotiatedApplicationProtocol.Protocol; + public ReadOnlyMemory ApplicationProtocol => _snapshotted ? _applicationProtocol : _sslStream.NegotiatedApplicationProtocol.Protocol; - public SslProtocols Protocol => _sslStream.SslProtocol; + public SslProtocols Protocol => _snapshotted ? _protocol : _sslStream.SslProtocol; public SslStream SslStream => _sslStream; - // We don't store the values for these because they could be changed by a renegotiation. + public Exception? Exception { get; set; } + + // After Snapshot() is called, all values are served from cached fields instead of the SslStream. - public TlsCipherSuite? NegotiatedCipherSuite => _sslStream.NegotiatedCipherSuite; + public TlsCipherSuite? NegotiatedCipherSuite => _snapshotted ? _negotiatedCipherSuite : _sslStream.NegotiatedCipherSuite; [Obsolete(Obsoletions.RuntimeTlsCipherAlgorithmEnumsMessage, DiagnosticId = Obsoletions.RuntimeTlsCipherAlgorithmEnumsDiagId, UrlFormat = Obsoletions.RuntimeSharedUrlFormat)] - public CipherAlgorithmType CipherAlgorithm => _sslStream.CipherAlgorithm; + public CipherAlgorithmType CipherAlgorithm => _snapshotted ? _cipherAlgorithm : _sslStream.CipherAlgorithm; [Obsolete(Obsoletions.RuntimeTlsCipherAlgorithmEnumsMessage, DiagnosticId = Obsoletions.RuntimeTlsCipherAlgorithmEnumsDiagId, UrlFormat = Obsoletions.RuntimeSharedUrlFormat)] - public int CipherStrength => _sslStream.CipherStrength; + public int CipherStrength => _snapshotted ? _cipherStrength : _sslStream.CipherStrength; [Obsolete(Obsoletions.RuntimeTlsCipherAlgorithmEnumsMessage, DiagnosticId = Obsoletions.RuntimeTlsCipherAlgorithmEnumsDiagId, UrlFormat = Obsoletions.RuntimeSharedUrlFormat)] - public HashAlgorithmType HashAlgorithm => _sslStream.HashAlgorithm; + public HashAlgorithmType HashAlgorithm => _snapshotted ? _hashAlgorithm : _sslStream.HashAlgorithm; [Obsolete(Obsoletions.RuntimeTlsCipherAlgorithmEnumsMessage, DiagnosticId = Obsoletions.RuntimeTlsCipherAlgorithmEnumsDiagId, UrlFormat = Obsoletions.RuntimeSharedUrlFormat)] - public int HashStrength => _sslStream.HashStrength; + public int HashStrength => _snapshotted ? _hashStrength : _sslStream.HashStrength; [Obsolete(Obsoletions.RuntimeTlsCipherAlgorithmEnumsMessage, DiagnosticId = Obsoletions.RuntimeTlsCipherAlgorithmEnumsDiagId, UrlFormat = Obsoletions.RuntimeSharedUrlFormat)] - public ExchangeAlgorithmType KeyExchangeAlgorithm => _sslStream.KeyExchangeAlgorithm; + public ExchangeAlgorithmType KeyExchangeAlgorithm => _snapshotted ? _keyExchangeAlgorithm : _sslStream.KeyExchangeAlgorithm; [Obsolete(Obsoletions.RuntimeTlsCipherAlgorithmEnumsMessage, DiagnosticId = Obsoletions.RuntimeTlsCipherAlgorithmEnumsDiagId, UrlFormat = Obsoletions.RuntimeSharedUrlFormat)] - public int KeyExchangeStrength => _sslStream.KeyExchangeStrength; + public int KeyExchangeStrength => _snapshotted ? _keyExchangeStrength : _sslStream.KeyExchangeStrength; public Task GetClientCertificateAsync(CancellationToken cancellationToken) { diff --git a/src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs b/src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs index 7f6b3bf1b197..729bd257dbd2 100644 --- a/src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs +++ b/src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs @@ -187,6 +187,8 @@ public async Task OnConnectionAsync(ConnectionContext context) } catch (OperationCanceledException ex) { + feature.Exception = ex; + feature.Snapshot(); RecordHandshakeFailed(_metrics, startTimestamp, Stopwatch.GetTimestamp(), metricsContext, metricsTagsFeature, ex); _logger.AuthenticationTimedOut(); @@ -195,6 +197,8 @@ public async Task OnConnectionAsync(ConnectionContext context) } catch (IOException ex) { + feature.Exception = ex; + feature.Snapshot(); RecordHandshakeFailed(_metrics, startTimestamp, Stopwatch.GetTimestamp(), metricsContext, metricsTagsFeature, ex); _logger.AuthenticationFailed(ex); @@ -203,6 +207,8 @@ public async Task OnConnectionAsync(ConnectionContext context) } catch (AuthenticationException ex) { + feature.Exception = ex; + feature.Snapshot(); RecordHandshakeFailed(_metrics, startTimestamp, Stopwatch.GetTimestamp(), metricsContext, metricsTagsFeature, ex); _logger.AuthenticationFailed(ex); @@ -238,7 +244,16 @@ public async Task OnConnectionAsync(ConnectionContext context) await using (sslStream) await using (sslDuplexPipe) { - await _next(context); + try + { + await _next(context); + } + finally + { + // Snapshot SslStream-backed properties before disposal so outer middleware + // can still read ITlsHandshakeFeature after the connection completes. + feature.Snapshot(); + } // Dispose the inner stream (SslDuplexPipe) before disposing the SslStream // as the duplex pipe can hit an ODE as it still may be writing. } diff --git a/src/Servers/Kestrel/samples/SampleApp/Startup.cs b/src/Servers/Kestrel/samples/SampleApp/Startup.cs index 54352b5a86c8..84a94767c76a 100644 --- a/src/Servers/Kestrel/samples/SampleApp/Startup.cs +++ b/src/Servers/Kestrel/samples/SampleApp/Startup.cs @@ -105,9 +105,27 @@ public static Task Main(string[] args) options.Listen(IPAddress.Loopback, basePort + 1, listenOptions => { - listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1; + listenOptions.Use(next => async context => + { + await next(context); + + var tlsHandshakeFeature = context.Features.Get(); + if (tlsHandshakeFeature?.Exception is { } ex) + { + Console.WriteLine($"[TLS Handshake Failed] ConnectionId={context.ConnectionId}, Exception={ex.GetType().Name}: {ex.Message}"); + } + }); + listenOptions.UseHttps(); listenOptions.UseConnectionLogging(); + + listenOptions.Use(next => async context => + { + var tlsHandshakeFeature = context.Features.Get(); + Console.WriteLine($"[TLS Handshake OK] ConnectionId={context.ConnectionId}, Protocol={tlsHandshakeFeature.Protocol}"); + + await next(context); + }); }); options.ListenLocalhost(basePort + 2, listenOptions => diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsConnectionMiddlewareTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsConnectionMiddlewareTests.cs index 2d4ab6c59018..d4f3b9de18a1 100644 --- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsConnectionMiddlewareTests.cs +++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsConnectionMiddlewareTests.cs @@ -202,6 +202,107 @@ void ConfigureListenOptions(ListenOptions listenOptions) } } + [Fact] + public async Task HandshakeExceptionIsAvailableAfterHandshakeFailure() + { + var handshakeFeatureTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + void ConfigureListenOptions(ListenOptions listenOptions) + { + // Outer middleware wraps the HTTPS middleware and can inspect the feature after it returns. + listenOptions.Use(next => async connectionContext => + { + await next(connectionContext); + + var feature = connectionContext.Features.Get(); + handshakeFeatureTcs.TrySetResult(feature); + }); + + listenOptions.UseHttps(new HttpsConnectionAdapterOptions { ServerCertificate = _x509Certificate2 }); + } + + await using (var server = new TestServer(context => Task.CompletedTask, new TestServiceContext(LoggerFactory), ConfigureListenOptions)) + { + using var connection = server.CreateConnection(); + await using var sslStream = new SslStream(connection.Stream); + + var clientAuthOptions = new SslClientAuthenticationOptions + { + TargetHost = "localhost", + // Only enabling an obsolete protocol should cause a handshake failure. +#pragma warning disable CS0618 // Type or member is obsolete + EnabledSslProtocols = SslProtocols.Ssl2, +#pragma warning restore CS0618 + }; + + using var handshakeCts = new CancellationTokenSource(TestConstants.DefaultTimeout); + await Assert.ThrowsAnyAsync(() => sslStream.AuthenticateAsClientAsync(clientAuthOptions, handshakeCts.Token)); + + var handshakeFeature = await handshakeFeatureTcs.Task.DefaultTimeout(); + Assert.NotNull(handshakeFeature); + Assert.NotNull(handshakeFeature.Exception); + } + } + + [Fact] + public async Task HandshakeFeaturePropertiesAreAccessibleAfterHandshakeTimeout() + { + var handshakeFeatureTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + void ConfigureListenOptions(ListenOptions listenOptions) + { + listenOptions.Use(next => async connectionContext => + { + await next(connectionContext); + + var feature = connectionContext.Features.Get(); + handshakeFeatureTcs.TrySetResult(feature); + }); + + listenOptions.UseHttps(o => + { + o.ServerCertificate = _x509Certificate2; + o.HandshakeTimeout = TimeSpan.FromSeconds(2); + }); + } + + await using (var server = new TestServer(context => Task.CompletedTask, new TestServiceContext(LoggerFactory), ConfigureListenOptions)) + { + using var connection = server.CreateConnection(); + // Don't send any TLS data — let the handshake time out. + Assert.Equal(0, await connection.Stream.ReadAsync(new byte[1], 0, 1).DefaultTimeout()); + + var handshakeFeature = await handshakeFeatureTcs.Task.DefaultTimeout(); + Assert.NotNull(handshakeFeature); + Assert.IsAssignableFrom(handshakeFeature.Exception); + } + } + + [Fact] + public async Task HandshakeExceptionIsNullOnSuccessfulHandshake() + { + ITlsHandshakeFeature capturedFeature = null; + + void ConfigureListenOptions(ListenOptions listenOptions) + { + listenOptions.UseHttps(new HttpsConnectionAdapterOptions { ServerCertificate = _x509Certificate2 }); + } + + await using (var server = new TestServer(context => + { + capturedFeature = context.Features.Get(); + Assert.NotNull(capturedFeature); + Assert.Null(capturedFeature.Exception); + return context.Response.WriteAsync("hello world"); + }, new TestServiceContext(LoggerFactory), ConfigureListenOptions)) + { + var result = await server.HttpClientSlim.GetStringAsync($"https://localhost:{server.Port}/", validateCertificate: false); + Assert.Equal("hello world", result); + } + + Assert.NotNull(capturedFeature); + } + [Fact] public async Task RequireCertificateFailsWhenNoCertificate() { From 303e2e36655575823645139f7389a1d6913c7315 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Fri, 10 Apr 2026 21:27:23 +0000 Subject: [PATCH 05/13] Update dependencies from build 309901 Updated Dependencies: Microsoft.NET.Runtime.WebAssembly.Sdk, Microsoft.NETCore.BrowserDebugHost.Transport, Microsoft.NET.Runtime.MonoAOTCompiler.Task, dotnet-ef, Microsoft.Bcl.AsyncInterfaces, Microsoft.Bcl.TimeProvider, Microsoft.EntityFrameworkCore, Microsoft.EntityFrameworkCore.Design, Microsoft.EntityFrameworkCore.InMemory, Microsoft.EntityFrameworkCore.Relational, Microsoft.EntityFrameworkCore.Sqlite, Microsoft.EntityFrameworkCore.SqlServer, Microsoft.EntityFrameworkCore.Tools, Microsoft.Extensions.Caching.Abstractions, Microsoft.Extensions.Caching.Memory, Microsoft.Extensions.Configuration, Microsoft.Extensions.Configuration.Abstractions, Microsoft.Extensions.Configuration.Binder, Microsoft.Extensions.Configuration.CommandLine, Microsoft.Extensions.Configuration.EnvironmentVariables, Microsoft.Extensions.Configuration.FileExtensions, Microsoft.Extensions.Configuration.Ini, Microsoft.Extensions.Configuration.Json, Microsoft.Extensions.Configuration.UserSecrets, Microsoft.Extensions.Configuration.Xml, Microsoft.Extensions.DependencyInjection, Microsoft.Extensions.DependencyInjection.Abstractions, Microsoft.Extensions.DependencyModel, Microsoft.Extensions.Diagnostics, Microsoft.Extensions.Diagnostics.Abstractions, Microsoft.Extensions.FileProviders.Abstractions, Microsoft.Extensions.FileProviders.Composite, Microsoft.Extensions.FileProviders.Physical, Microsoft.Extensions.FileSystemGlobbing, Microsoft.Extensions.HostFactoryResolver.Sources, Microsoft.Extensions.Hosting, Microsoft.Extensions.Hosting.Abstractions, Microsoft.Extensions.Http, Microsoft.Extensions.Logging, Microsoft.Extensions.Logging.Abstractions, Microsoft.Extensions.Logging.Configuration, Microsoft.Extensions.Logging.Console, Microsoft.Extensions.Logging.Debug, Microsoft.Extensions.Logging.EventLog, Microsoft.Extensions.Logging.EventSource, Microsoft.Extensions.Logging.TraceSource, Microsoft.Extensions.Options, Microsoft.Extensions.Options.ConfigurationExtensions, Microsoft.Extensions.Options.DataAnnotations, Microsoft.Extensions.Primitives, Microsoft.Internal.Runtime.AspNetCore.Transport, Microsoft.NETCore.App.Ref, Microsoft.NETCore.Platforms, System.Collections.Immutable, System.Composition, System.Configuration.ConfigurationManager, System.Diagnostics.DiagnosticSource, System.Diagnostics.EventLog, System.Diagnostics.PerformanceCounter, System.DirectoryServices.Protocols, System.Formats.Asn1, System.Formats.Cbor, System.IO.Hashing, System.IO.Pipelines, System.Memory.Data, System.Net.Http.Json, System.Net.Http.WinHttpHandler, System.Net.ServerSentEvents, System.Numerics.Tensors, System.Reflection.Metadata, System.Resources.Extensions, System.Runtime.Caching, System.Security.Cryptography.Pkcs, System.Security.Cryptography.Xml, System.Security.Permissions, System.ServiceProcess.ServiceController, System.Text.Encodings.Web, System.Text.Json, System.Threading.AccessControl, System.Threading.Channels, System.Threading.RateLimiting (Version 11.0.0-preview.4.26208.110 -> 11.0.0-preview.4.26210.110) Microsoft.DotNet.Arcade.Sdk, Microsoft.DotNet.Build.Tasks.Archives, Microsoft.DotNet.Build.Tasks.Installers, Microsoft.DotNet.Build.Tasks.Templating, Microsoft.DotNet.Helix.Sdk, Microsoft.DotNet.RemoteExecutor, Microsoft.DotNet.SharedFramework.Sdk (Version 11.0.0-beta.26208.110 -> 11.0.0-beta.26210.110) Microsoft.Web.Xdt (Version 3.3.0-preview.4.26208.110 -> 3.3.0-preview.4.26210.110) NuGet.Frameworks, NuGet.Packaging, NuGet.Versioning (Version 7.6.0-rc.20910 -> 7.6.0-rc.21110) [[ commit created by automation ]] --- NuGet.config | 1 - eng/Version.Details.props | 184 +++++++++---------- eng/Version.Details.xml | 370 +++++++++++++++++++------------------- eng/common/sdk-task.ps1 | 2 +- eng/common/sdk-task.sh | 2 +- eng/common/tools.ps1 | 101 +++++++++-- eng/common/tools.sh | 89 +++++++-- global.json | 6 +- 8 files changed, 436 insertions(+), 319 deletions(-) diff --git a/NuGet.config b/NuGet.config index cecd386871cd..587ae4b8d5b9 100644 --- a/NuGet.config +++ b/NuGet.config @@ -4,7 +4,6 @@ - diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 2f9fec48d5a6..9910530150e7 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -6,98 +6,98 @@ This file should be imported by eng/Versions.props - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-beta.26208.110 - 11.0.0-beta.26208.110 - 11.0.0-beta.26208.110 - 11.0.0-beta.26208.110 - 11.0.0-beta.26208.110 - 11.0.0-beta.26208.110 - 11.0.0-beta.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 3.3.0-preview.4.26208.110 - 7.6.0-rc.20910 - 7.6.0-rc.20910 - 7.6.0-rc.20910 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 - 11.0.0-preview.4.26208.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-beta.26210.110 + 11.0.0-beta.26210.110 + 11.0.0-beta.26210.110 + 11.0.0-beta.26210.110 + 11.0.0-beta.26210.110 + 11.0.0-beta.26210.110 + 11.0.0-beta.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 3.3.0-preview.4.26210.110 + 7.6.0-rc.21110 + 7.6.0-rc.21110 + 7.6.0-rc.21110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 + 11.0.0-preview.4.26210.110 10.4.1 10.4.1 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index edb7c917c253..cfb86a1de371 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,333 +8,333 @@ See https://github.com/dotnet/arcade/blob/master/Documentation/Darc.md for instructions on using darc. --> - + - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc @@ -358,37 +358,37 @@ - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc https://github.com/dotnet/extensions @@ -440,17 +440,17 @@ https://github.com/dotnet/msbuild d1cce8d7cc03c23a4f1bad8e9240714fd9d199a3 - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc - + https://github.com/dotnet/dotnet - 0cf6b19ed68d2d52e097e6af6d6046b4eeefefe2 + 5bed4499b04cbbaec57ac4209ae993acca3648cc diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index b64b66a6275b..4017ff15ebf4 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -22,7 +22,7 @@ $warnAsError = if ($noWarnAsError) { $false } else { $true } function Print-Usage() { Write-Host "Common settings:" - Write-Host " -task Name of Arcade task (name of a project in SdkTasks directory of the Arcade SDK package)" + Write-Host " -task Name of Arcade task (name of a project in toolset directory of the Arcade SDK package)" Write-Host " -restore Restore dependencies" Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" Write-Host " -help Print help and exit" diff --git a/eng/common/sdk-task.sh b/eng/common/sdk-task.sh index 3270f83fa9a7..1cf71bb2aea4 100755 --- a/eng/common/sdk-task.sh +++ b/eng/common/sdk-task.sh @@ -2,7 +2,7 @@ show_usage() { echo "Common settings:" - echo " --task Name of Arcade task (name of a project in SdkTasks directory of the Arcade SDK package)" + echo " --task Name of Arcade task (name of a project in toolset directory of the Arcade SDK package)" echo " --restore Restore dependencies" echo " --verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" echo " --help Print help and exit" diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 2b593af51cee..6710ffb884bb 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -545,7 +545,6 @@ function LocateVisualStudio([object]$vsRequirements = $null){ if (Get-Member -InputObject $GlobalJson.tools -Name 'vswhere') { $vswhereVersion = $GlobalJson.tools.vswhere } else { - # keep this in sync with the VSWhereVersion in DefaultVersions.props $vswhereVersion = '3.1.7' } @@ -680,7 +679,17 @@ function GetNuGetPackageCachePath() { # Returns a full path to an Arcade SDK task project file. function GetSdkTaskProject([string]$taskName) { - return Join-Path (Split-Path (InitializeToolset) -Parent) "SdkTasks\$taskName.proj" + $toolsetDir = Split-Path (InitializeToolset) -Parent + $proj = Join-Path $toolsetDir "$taskName.proj" + if (Test-Path $proj) { + return $proj + } + # TODO: Remove this fallback once all supported versions use the new layout. + $legacyProj = Join-Path $toolsetDir "SdkTasks\$taskName.proj" + if (Test-Path $legacyProj) { + return $legacyProj + } + throw "Unable to find $taskName.proj in toolset at: $toolsetDir" } function InitializeNativeTools() { @@ -717,13 +726,18 @@ function InitializeToolset() { $nugetCache = GetNuGetPackageCachePath $toolsetVersion = Read-ArcadeSdkVersion - $toolsetLocationFile = Join-Path $ToolsetDir "$toolsetVersion.txt" + $toolsetToolsDir = Join-Path $ToolsetDir $toolsetVersion - if (Test-Path $toolsetLocationFile) { - $path = Get-Content $toolsetLocationFile -TotalCount 1 - if (Test-Path $path) { - return $global:_InitializeToolset = $path - } + # Check if the toolset has already been extracted + $toolsetBuildProj = $null + $buildProjPath = Join-Path $toolsetToolsDir 'Build.proj' + + if (Test-Path $buildProjPath) { + $toolsetBuildProj = $buildProjPath + } + + if ($toolsetBuildProj -ne $null) { + return $global:_InitializeToolset = $toolsetBuildProj } if (-not $restore) { @@ -731,21 +745,40 @@ function InitializeToolset() { ExitWithExitCode 1 } - $buildTool = InitializeBuildTool + $downloadArgs = @("package", "download", "Microsoft.DotNet.Arcade.Sdk@$toolsetVersion", "--prerelease", "--output", "$nugetCache") + if ($env:NUGET_CONFIG) { + $downloadArgs += "--configfile" + $downloadArgs += $env:NUGET_CONFIG + } + DotNet @downloadArgs - $proj = Join-Path $ToolsetDir 'restore.proj' - $bl = if ($binaryLog) { '/bl:' + (Join-Path $LogDir 'ToolsetRestore.binlog') } else { '' } + $packageDir = Join-Path $nugetCache (Join-Path 'microsoft.dotnet.arcade.sdk' $toolsetVersion) + $packageToolsetDir = Join-Path $packageDir 'toolset' + $packageToolsDir = Join-Path $packageDir 'tools' - '' | Set-Content $proj + # TODO: Remove the tools/ check once all supported versions have the toolset folder. + if (!(Test-Path $packageToolsetDir) -and !(Test-Path $packageToolsDir)) { + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Arcade SDK package does not contain a toolset or tools folder: $packageDir" + ExitWithExitCode 3 + } - MSBuild-Core $proj $bl /t:__WriteToolsetLocation /clp:ErrorsOnly`;NoSummary /p:__ToolsetLocationOutputFile=$toolsetLocationFile + New-Item -ItemType Directory -Path $toolsetToolsDir -Force | Out-Null - $path = Get-Content $toolsetLocationFile -Encoding UTF8 -TotalCount 1 - if (!(Test-Path $path)) { - throw "Invalid toolset path: $path" + # Copy toolset if present at the package root (new layout), otherwise fall back to tools + if (Test-Path $packageToolsetDir) { + Copy-Item -Path "$packageToolsetDir\*" -Destination $toolsetToolsDir -Recurse -Force + } else { + # TODO: Remove this fallback once all supported versions have the toolset folder. + Copy-Item -Path "$packageToolsDir\*" -Destination $toolsetToolsDir -Recurse -Force } - return $global:_InitializeToolset = $path + if (Test-Path $buildProjPath) { + $toolsetBuildProj = $buildProjPath + } else { + throw "Unable to find Build.proj in toolset at: $toolsetToolsDir" + } + + return $global:_InitializeToolset = $toolsetBuildProj } function ExitWithExitCode([int] $exitCode) { @@ -806,6 +839,40 @@ function MSBuild() { MSBuild-Core @args } +# +# Executes a dotnet command with arguments passed to the function. +# Terminates the script if the command fails. +# +function DotNet() { + $dotnetRoot = InitializeDotNetCli -install:$restore + $dotnetPath = Join-Path $dotnetRoot (GetExecutableFileName 'dotnet') + + $cmdArgs = "" + foreach ($arg in $args) { + if ($null -ne $arg -and $arg.Trim() -ne "") { + if ($arg.EndsWith('\')) { + $arg = $arg + "\" + } + $cmdArgs += " `"$arg`"" + } + } + + $env:ARCADE_BUILD_TOOL_COMMAND = "`"$dotnetPath`" $cmdArgs" + + $exitCode = Exec-Process $dotnetPath $cmdArgs + + if ($exitCode -ne 0) { + Write-Host "dotnet command failed with exit code $exitCode. Check errors above." -ForegroundColor Red + + if ($ci -and $env:SYSTEM_TEAMPROJECT -ne $null -and !$fromVMR) { + Write-PipelineSetResult -Result "Failed" -Message "dotnet command execution failed." + ExitWithExitCode 0 + } else { + ExitWithExitCode $exitCode + } + } +} + # # Executes msbuild (or 'dotnet msbuild') with arguments passed to the function. # The arguments are automatically quoted. diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 80d2dbd0fe3d..d2339eb21d59 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -407,15 +407,18 @@ function InitializeToolset { ReadGlobalVersion "Microsoft.DotNet.Arcade.Sdk" local toolset_version=$_ReadGlobalVersion - local toolset_location_file="$toolset_dir/$toolset_version.txt" + local toolset_tools_dir="$toolset_dir/$toolset_version" - if [[ -a "$toolset_location_file" ]]; then - local path=`cat "$toolset_location_file"` - if [[ -a "$path" ]]; then - # return value - _InitializeToolset="$path" - return - fi + # Check if the toolset has already been extracted + local toolset_build_proj="" + if [[ -a "$toolset_tools_dir/Build.proj" ]]; then + toolset_build_proj="$toolset_tools_dir/Build.proj" + fi + + if [[ -n "$toolset_build_proj" ]]; then + # return value + _InitializeToolset="$toolset_build_proj" + return fi if [[ "$restore" != true ]]; then @@ -423,20 +426,34 @@ function InitializeToolset { ExitWithExitCode 2 fi - local proj="$toolset_dir/restore.proj" + local download_args=("package" "download" "Microsoft.DotNet.Arcade.Sdk@$toolset_version" "--prerelease" "--output" "$_GetNuGetPackageCachePath") + if [[ -n "${NUGET_CONFIG:-}" ]]; then + download_args+=("--configfile" "$NUGET_CONFIG") + fi + DotNet "${download_args[@]}" + + local package_dir="$_GetNuGetPackageCachePath/microsoft.dotnet.arcade.sdk/$toolset_version" - local bl="" - if [[ "$binary_log" == true ]]; then - bl="/bl:$log_dir/ToolsetRestore.binlog" + # TODO: Remove the tools/ check once all supported versions have the toolset folder. + if [[ ! -d "$package_dir/toolset" && ! -d "$package_dir/tools" ]]; then + Write-PipelineTelemetryError -category 'InitializeToolset' "Arcade SDK package does not contain a toolset or tools folder: $package_dir" + ExitWithExitCode 3 fi - echo '' > "$proj" - MSBuild-Core "$proj" $bl /t:__WriteToolsetLocation /clp:ErrorsOnly\;NoSummary /p:__ToolsetLocationOutputFile="$toolset_location_file" + mkdir -p "$toolset_tools_dir" - local toolset_build_proj=`cat "$toolset_location_file"` + # Copy toolset if present at the package root (new layout), otherwise fall back to tools + if [[ -d "$package_dir/toolset" ]]; then + cp -r "$package_dir/toolset/." "$toolset_tools_dir" + else + # TODO: Remove this fallback once all supported versions have the toolset folder. + cp -r "$package_dir/tools/." "$toolset_tools_dir" + fi - if [[ ! -a "$toolset_build_proj" ]]; then - Write-PipelineTelemetryError -category 'Build' "Invalid toolset path: $toolset_build_proj" + if [[ -a "$toolset_tools_dir/Build.proj" ]]; then + toolset_build_proj="$toolset_tools_dir/Build.proj" + else + Write-PipelineTelemetryError -category 'Build' "Unable to find Build.proj in toolset at: $toolset_tools_dir" ExitWithExitCode 3 fi @@ -458,6 +475,26 @@ function StopProcesses { return 0 } +function DotNet { + InitializeDotNetCli $restore + + local dotnet_path="$_InitializeDotNetCli/dotnet" + + export ARCADE_BUILD_TOOL_COMMAND="$dotnet_path $@" + + "$dotnet_path" "$@" || { + local exit_code=$? + echo "dotnet command failed with exit code $exit_code. Check errors above." + + if [[ "$ci" == true && -n ${SYSTEM_TEAMPROJECT:-} && "$from_vmr" != true ]]; then + Write-PipelineSetResult -result "Failed" -message "dotnet command execution failed." + ExitWithExitCode 0 + else + ExitWithExitCode $exit_code + fi + } +} + function MSBuild { local args=( "$@" ) if [[ "$pipelines_log" == true ]]; then @@ -555,8 +592,22 @@ function GetDarc { # Returns a full path to an Arcade SDK task project file. function GetSdkTaskProject { - taskName=$1 - echo "$(dirname $_InitializeToolset)/SdkTasks/$taskName.proj" + local taskName=$1 + local toolsetDir + toolsetDir="$(dirname "$_InitializeToolset")" + local proj="$toolsetDir/$taskName.proj" + if [[ -a "$proj" ]]; then + echo "$proj" + return + fi + # TODO: Remove this fallback once all supported versions use the new layout. + local legacyProj="$toolsetDir/SdkTasks/$taskName.proj" + if [[ -a "$legacyProj" ]]; then + echo "$legacyProj" + return + fi + Write-PipelineTelemetryError -category 'Build' "Unable to find $taskName.proj in toolset at: $toolsetDir" + ExitWithExitCode 3 } ResolvePath "${BASH_SOURCE[0]}" diff --git a/global.json b/global.json index 83ee2a1d223c..668e0b54fda2 100644 --- a/global.json +++ b/global.json @@ -22,9 +22,9 @@ "jdk": "latest" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26208.110", - "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26208.110", - "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26208.110", + "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26210.110", + "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26210.110", + "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26210.110", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0", "Microsoft.WixToolset.Sdk": "5.0.2-dotnet.2811440" From 625dcf8e73055c5c3c021609daec30d886b1005a Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Fri, 10 Apr 2026 14:29:06 -0700 Subject: [PATCH 06/13] Add back package source for dotnet-extensions --- NuGet.config | 1 + 1 file changed, 1 insertion(+) diff --git a/NuGet.config b/NuGet.config index 587ae4b8d5b9..cecd386871cd 100644 --- a/NuGet.config +++ b/NuGet.config @@ -4,6 +4,7 @@ + From e365c62432ff796403ca5d1f44fb48d4eac27185 Mon Sep 17 00:00:00 2001 From: William Godbe Date: Tue, 14 Apr 2026 12:41:37 -0700 Subject: [PATCH 07/13] Remove DownloadFile task from RepoTasks Removed the DownloadFile task from RepoTasks. --- eng/tools/RepoTasks/RepoTasks.tasks | 2 -- 1 file changed, 2 deletions(-) diff --git a/eng/tools/RepoTasks/RepoTasks.tasks b/eng/tools/RepoTasks/RepoTasks.tasks index 7a97f82e4541..7bf63d491e17 100644 --- a/eng/tools/RepoTasks/RepoTasks.tasks +++ b/eng/tools/RepoTasks/RepoTasks.tasks @@ -6,6 +6,4 @@ - - From c4befcc97a1dc039a25dc59951788a064faadfee Mon Sep 17 00:00:00 2001 From: William Godbe Date: Tue, 14 Apr 2026 16:58:44 -0700 Subject: [PATCH 08/13] Add quarantined test for AuthHeaderEnvironmentVariableRemoved --- src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs index 9d79717a4eea..83354d2c0c1d 100644 --- a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs +++ b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs @@ -1186,6 +1186,7 @@ public async Task GetLongEnvironmentVariable_OutOfProcess() public Task AuthHeaderEnvironmentVariableRemoved_InProcess() => AuthHeaderEnvironmentVariableRemoved(HostingModel.InProcess); [ConditionalFact] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public Task AuthHeaderEnvironmentVariableRemoved_OutOfProcess() => AuthHeaderEnvironmentVariableRemoved(HostingModel.OutOfProcess); private async Task AuthHeaderEnvironmentVariableRemoved(HostingModel hostingModel) From 246a359096cc3837c3d0fe24f1d42dab82fb337a Mon Sep 17 00:00:00 2001 From: wigodbe Date: Tue, 14 Apr 2026 17:18:10 -0700 Subject: [PATCH 09/13] Quarantine IIS NewShim StartupTests failing due to runtime-async All 18 StartupTests methods in IIS.NewShim.FunctionalTests are failing after runtime-async was enabled unconditionally in CoreCLR (dotnet/runtime#126680, dotnet/runtime#126594). The tests return HTTP 500 even though the app starts successfully in-process. Tracking issue: https://github.com/dotnet/runtime/issues/126925 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../IIS/test/Common.LongTests/StartupTests.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs index 83354d2c0c1d..7e397c278d7a 100644 --- a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs +++ b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs @@ -41,6 +41,7 @@ public StartupTests(PublishedSitesFixture fixture) : base(fixture) [ConditionalFact] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task ExpandEnvironmentVariableInWebConfig() { // Point to dotnet installed in user profile. @@ -82,6 +83,7 @@ public async Task InvalidProcessPath_ExpectServerError(string path, string argum } [ConditionalFact] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithDotnetLocationWithoutExe() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -93,6 +95,7 @@ public async Task StartsWithDotnetLocationWithoutExe() } [ConditionalFact] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithDotnetLocationUppercase() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -107,6 +110,7 @@ public async Task StartsWithDotnetLocationUppercase() [InlineData("dotnet")] [InlineData("dotnet.EXE")] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithDotnetOnThePath(string path) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -126,6 +130,7 @@ public async Task StartsWithDotnetOnThePath(string path) [SkipIfNotAdmin] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithDotnetInstallLocation() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -191,6 +196,7 @@ public static TestMatrix TestVariants [ConditionalTheory] [MemberData(nameof(TestVariants))] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task HelloWorld(TestVariant variant) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(variant); @@ -199,6 +205,7 @@ public async Task HelloWorld(TestVariant variant) [ConditionalFact] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithPortableAndBootstraperExe() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(Fixture.InProcessTestSite); @@ -593,6 +600,7 @@ await EventLogHelpers.VerifyEventLogEvents(deploymentResult, [ConditionalTheory] [MemberData(nameof(PortableConfigTransformationsScenarios))] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithWebConfigVariationsPortable(string scenario) { var action = PortableConfigTransformations[scenario]; @@ -663,6 +671,7 @@ public static Dictionary> InitPort [ConditionalTheory] [MemberData(nameof(StandaloneConfigTransformationsScenarios))] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithWebConfigVariationsStandalone(string scenario) { var action = StandaloneConfigTransformations[scenario]; @@ -718,6 +727,7 @@ public async Task SetCurrentDirectoryHandlerSettingWorks() [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartupIsSuspendedWhenEventIsUsed() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -1145,6 +1155,7 @@ public async Task IncludesAdditionalErrorPageTextInProcessStartupFailure_Correct } [ConditionalFact] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task GetLongEnvironmentVariable_InProcess() { var expectedValue = "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" + @@ -1164,6 +1175,7 @@ public async Task GetLongEnvironmentVariable_InProcess() [ConditionalFact] [RequiresNewShim] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task GetLongEnvironmentVariable_OutOfProcess() { var expectedValue = "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" + @@ -1205,6 +1217,7 @@ private async Task AuthHeaderEnvironmentVariableRemoved(HostingModel hostingMode [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public Task WebConfigOverridesGlobalEnvironmentVariables_OutOfProcess() => WebConfigOverridesGlobalEnvironmentVariables(HostingModel.OutOfProcess); private async Task WebConfigOverridesGlobalEnvironmentVariables(HostingModel hostingModel) @@ -1223,6 +1236,7 @@ private async Task WebConfigOverridesGlobalEnvironmentVariables(HostingModel hos [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public Task WebConfigAppendsHostingStartup_OutOfProcess() => WebConfigAppendsHostingStartup(HostingModel.OutOfProcess); private async Task WebConfigAppendsHostingStartup(HostingModel hostingModel) @@ -1247,6 +1261,7 @@ private async Task WebConfigAppendsHostingStartup(HostingModel hostingModel) [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public Task WebConfigOverridesHostingStartup_OutOfProcess() => WebConfigOverridesHostingStartup(HostingModel.OutOfProcess); private async Task WebConfigOverridesHostingStartup(HostingModel hostingModel) @@ -1265,6 +1280,7 @@ private async Task WebConfigOverridesHostingStartup(HostingModel hostingModel) [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public Task WebConfigExpandsVariables_OutOfProcess() => WebConfigExpandsVariables(HostingModel.OutOfProcess); private async Task WebConfigExpandsVariables(HostingModel hostingModel) @@ -1349,6 +1365,7 @@ public async Task AncmHttpsPortCanBeOverriden() [ConditionalFact] [RequiresNewShim] + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task HttpsRedirectionWorksIn30AndNot22() { var port = TestPortHelper.GetNextSSLPort(); From 2d39f62d44fe2fda6ef896b2f1950f9ec1577a89 Mon Sep 17 00:00:00 2001 From: wigodbe Date: Tue, 14 Apr 2026 17:21:44 -0700 Subject: [PATCH 10/13] Quarantine IIS NewShim StartupTests only (not other IIS variants) Only the NewShim variants of StartupTests are failing after runtime-async was enabled in CoreCLR. Use a partial class to apply [QuarantinedTest] only to the NewShim assembly, leaving the IIS, IISExpress, and NewHandler variants unaffected. Tracking issue: https://github.com/dotnet/runtime/issues/126925 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../IIS/test/Common.LongTests/StartupTests.cs | 19 +------------------ .../StartupTests.cs | 11 +++++++++++ 2 files changed, 12 insertions(+), 18 deletions(-) create mode 100644 src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/StartupTests.cs diff --git a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs index 7e397c278d7a..0ed1c9d5b405 100644 --- a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs +++ b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs @@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests; // Contains all tests related to Startup, requiring starting ANCM/IIS every time. [Collection(PublishedSitesCollection.Name)] -public class StartupTests : IISFunctionalTestBase +public partial class StartupTests : IISFunctionalTestBase { public StartupTests(PublishedSitesFixture fixture) : base(fixture) { @@ -41,7 +41,6 @@ public StartupTests(PublishedSitesFixture fixture) : base(fixture) [ConditionalFact] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task ExpandEnvironmentVariableInWebConfig() { // Point to dotnet installed in user profile. @@ -83,7 +82,6 @@ public async Task InvalidProcessPath_ExpectServerError(string path, string argum } [ConditionalFact] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithDotnetLocationWithoutExe() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -95,7 +93,6 @@ public async Task StartsWithDotnetLocationWithoutExe() } [ConditionalFact] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithDotnetLocationUppercase() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -110,7 +107,6 @@ public async Task StartsWithDotnetLocationUppercase() [InlineData("dotnet")] [InlineData("dotnet.EXE")] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithDotnetOnThePath(string path) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -130,7 +126,6 @@ public async Task StartsWithDotnetOnThePath(string path) [SkipIfNotAdmin] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithDotnetInstallLocation() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -196,7 +191,6 @@ public static TestMatrix TestVariants [ConditionalTheory] [MemberData(nameof(TestVariants))] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task HelloWorld(TestVariant variant) { var deploymentParameters = Fixture.GetBaseDeploymentParameters(variant); @@ -205,7 +199,6 @@ public async Task HelloWorld(TestVariant variant) [ConditionalFact] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithPortableAndBootstraperExe() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(Fixture.InProcessTestSite); @@ -600,7 +593,6 @@ await EventLogHelpers.VerifyEventLogEvents(deploymentResult, [ConditionalTheory] [MemberData(nameof(PortableConfigTransformationsScenarios))] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithWebConfigVariationsPortable(string scenario) { var action = PortableConfigTransformations[scenario]; @@ -671,7 +663,6 @@ public static Dictionary> InitPort [ConditionalTheory] [MemberData(nameof(StandaloneConfigTransformationsScenarios))] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartsWithWebConfigVariationsStandalone(string scenario) { var action = StandaloneConfigTransformations[scenario]; @@ -727,7 +718,6 @@ public async Task SetCurrentDirectoryHandlerSettingWorks() [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task StartupIsSuspendedWhenEventIsUsed() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(); @@ -1155,7 +1145,6 @@ public async Task IncludesAdditionalErrorPageTextInProcessStartupFailure_Correct } [ConditionalFact] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task GetLongEnvironmentVariable_InProcess() { var expectedValue = "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" + @@ -1175,7 +1164,6 @@ public async Task GetLongEnvironmentVariable_InProcess() [ConditionalFact] [RequiresNewShim] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task GetLongEnvironmentVariable_OutOfProcess() { var expectedValue = "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" + @@ -1217,7 +1205,6 @@ private async Task AuthHeaderEnvironmentVariableRemoved(HostingModel hostingMode [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public Task WebConfigOverridesGlobalEnvironmentVariables_OutOfProcess() => WebConfigOverridesGlobalEnvironmentVariables(HostingModel.OutOfProcess); private async Task WebConfigOverridesGlobalEnvironmentVariables(HostingModel hostingModel) @@ -1236,7 +1223,6 @@ private async Task WebConfigOverridesGlobalEnvironmentVariables(HostingModel hos [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public Task WebConfigAppendsHostingStartup_OutOfProcess() => WebConfigAppendsHostingStartup(HostingModel.OutOfProcess); private async Task WebConfigAppendsHostingStartup(HostingModel hostingModel) @@ -1261,7 +1247,6 @@ private async Task WebConfigAppendsHostingStartup(HostingModel hostingModel) [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public Task WebConfigOverridesHostingStartup_OutOfProcess() => WebConfigOverridesHostingStartup(HostingModel.OutOfProcess); private async Task WebConfigOverridesHostingStartup(HostingModel hostingModel) @@ -1280,7 +1265,6 @@ private async Task WebConfigOverridesHostingStartup(HostingModel hostingModel) [ConditionalFact] [RequiresNewShim] [RequiresIIS(IISCapability.PoolEnvironmentVariables)] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public Task WebConfigExpandsVariables_OutOfProcess() => WebConfigExpandsVariables(HostingModel.OutOfProcess); private async Task WebConfigExpandsVariables(HostingModel hostingModel) @@ -1365,7 +1349,6 @@ public async Task AncmHttpsPortCanBeOverriden() [ConditionalFact] [RequiresNewShim] - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] public async Task HttpsRedirectionWorksIn30AndNot22() { var port = TestPortHelper.GetNextSSLPort(); diff --git a/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/StartupTests.cs b/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/StartupTests.cs new file mode 100644 index 000000000000..78085e9365b1 --- /dev/null +++ b/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/StartupTests.cs @@ -0,0 +1,11 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.AspNetCore.InternalTesting; + +namespace Microsoft.AspNetCore.Server.IIS.NewShim.FunctionalTests; + +[QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] +public partial class StartupTests +{ +} From b63b1cf844b17753f65cac64318e337f033307bc Mon Sep 17 00:00:00 2001 From: wigodbe Date: Tue, 14 Apr 2026 17:24:30 -0700 Subject: [PATCH 11/13] Use #if NEWSHIM_FUNCTIONALS instead of partial class for quarantine Simpler approach: conditionally apply [QuarantinedTest] using the existing NEWSHIM_FUNCTIONALS define constant instead of adding a partial class and a new file. No new files needed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../IIS/IIS/test/Common.LongTests/StartupTests.cs | 5 ++++- .../test/IIS.NewShim.FunctionalTests/StartupTests.cs | 11 ----------- 2 files changed, 4 insertions(+), 12 deletions(-) delete mode 100644 src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/StartupTests.cs diff --git a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs index 0ed1c9d5b405..2daf4119c1fa 100644 --- a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs +++ b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs @@ -31,7 +31,10 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests; // Contains all tests related to Startup, requiring starting ANCM/IIS every time. [Collection(PublishedSitesCollection.Name)] -public partial class StartupTests : IISFunctionalTestBase +#if NEWSHIM_FUNCTIONALS +[QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] +#endif +public class StartupTests : IISFunctionalTestBase { public StartupTests(PublishedSitesFixture fixture) : base(fixture) { diff --git a/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/StartupTests.cs b/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/StartupTests.cs deleted file mode 100644 index 78085e9365b1..000000000000 --- a/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/StartupTests.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.AspNetCore.InternalTesting; - -namespace Microsoft.AspNetCore.Server.IIS.NewShim.FunctionalTests; - -[QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] -public partial class StartupTests -{ -} From 9fa3c61c8e950f4c9b48aa89c1f48d3da67614cd Mon Sep 17 00:00:00 2001 From: wigodbe Date: Tue, 14 Apr 2026 18:53:07 -0700 Subject: [PATCH 12/13] Quarantine ShutdownTests.OutOfProcessToInProcessHostingModelSwitchWorks for NewShim This test hangs in the NewShim variant, blocking the entire work item. Same runtime-async root cause as the StartupTests failures. Tracking issue: https://github.com/dotnet/runtime/issues/126925 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs b/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs index 5743ca4f6deb..85cec31e63e1 100644 --- a/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs +++ b/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs @@ -557,6 +557,9 @@ public async Task ConfigurationChangeCanBeIgnoredOutOfProcess() } [ConditionalFact] +#if NEWSHIM_FUNCTIONALS + [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] +#endif public async Task OutOfProcessToInProcessHostingModelSwitchWorks() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess); From 67b8ac38cb549884d907b23ebe0b2d064e02b14c Mon Sep 17 00:00:00 2001 From: wigodbe Date: Tue, 14 Apr 2026 21:38:55 -0700 Subject: [PATCH 13/13] Quarantine entire ShutdownTests class for NewShim Multiple ShutdownTests methods are failing/hanging in the NewShim variant. Move to class-level quarantine instead of individual method quarantine. Tracking issue: https://github.com/dotnet/runtime/issues/126925 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs b/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs index 85cec31e63e1..699a0b74e399 100644 --- a/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs +++ b/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs @@ -27,6 +27,9 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests; // Contains all tests related to shutdown, including app_offline, abort, and app recycle [Collection(PublishedSitesCollection.Name)] +#if NEWSHIM_FUNCTIONALS +[QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] +#endif public class ShutdownTests : IISFunctionalTestBase { public ShutdownTests(PublishedSitesFixture fixture) : base(fixture) @@ -557,9 +560,6 @@ public async Task ConfigurationChangeCanBeIgnoredOutOfProcess() } [ConditionalFact] -#if NEWSHIM_FUNCTIONALS - [QuarantinedTest("https://github.com/dotnet/runtime/issues/126925")] -#endif public async Task OutOfProcessToInProcessHostingModelSwitchWorks() { var deploymentParameters = Fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess);