diff --git a/NuGet.config b/NuGet.config index 1982e6173e71..881fe32b9c7a 100644 --- a/NuGet.config +++ b/NuGet.config @@ -4,7 +4,7 @@ - + diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 9d9345fa8ac8..acd5c1577449 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -9,13 +9,13 @@ This file should be imported by eng/Versions.props 10.0.1 10.0.1 10.0.1 - 10.0.0-beta.25555.106 - 10.0.0-beta.25555.106 - 10.0.0-beta.25555.106 - 10.0.0-beta.25555.106 - 10.0.0-beta.25555.106 - 10.0.0-beta.25555.106 - 10.0.0-beta.25555.106 + 10.0.0-beta.25562.108 + 10.0.0-beta.25562.108 + 10.0.0-beta.25562.108 + 10.0.0-beta.25562.108 + 10.0.0-beta.25562.108 + 10.0.0-beta.25562.108 + 10.0.0-beta.25562.108 10.0.1 10.0.1 10.0.1 @@ -44,7 +44,7 @@ This file should be imported by eng/Versions.props 10.0.1 10.0.1 10.0.1 - 10.0.1-servicing.25555.106 + 10.0.1-servicing.25562.108 10.0.1 10.0.1 10.0.1 @@ -60,16 +60,16 @@ This file should be imported by eng/Versions.props 10.0.1 10.0.1 10.0.1 - 10.0.1-servicing.25555.106 + 10.0.1-servicing.25562.108 10.0.1 10.0.1 10.0.1 - 10.0.1-servicing.25555.106 - 10.0.1-servicing.25555.106 - 3.2.0-preview.25555.106 - 7.0.0-rc.5606 - 7.0.0-rc.5606 - 7.0.0-rc.5606 + 10.0.1-servicing.25562.108 + 10.0.1-servicing.25562.108 + 3.2.0-preview.25562.108 + 7.0.0-rc.6308 + 7.0.0-rc.6308 + 7.0.0-rc.6308 10.0.1 10.0.1 10.0.1 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 23175398be77..0fd76fe64297 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 - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d @@ -358,37 +358,37 @@ - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d https://github.com/dotnet/extensions @@ -440,17 +440,17 @@ https://github.com/dotnet/msbuild 465c45808f0e9f3c32eb145101eeeccdc29d39e6 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f4701e048e6a684237a4b52b745e21b1d857278d diff --git a/eng/common/core-templates/job/publish-build-assets.yml b/eng/common/core-templates/job/publish-build-assets.yml index 37dff559fc1b..e7daa6d2fafe 100644 --- a/eng/common/core-templates/job/publish-build-assets.yml +++ b/eng/common/core-templates/job/publish-build-assets.yml @@ -180,6 +180,11 @@ jobs: PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} is1ESPipeline: ${{ parameters.is1ESPipeline }} + # Darc is targeting 8.0, so make sure it's installed + - task: UseDotNet@2 + inputs: + version: 8.0.x + - task: AzureCLI@2 displayName: Publish Using Darc inputs: diff --git a/eng/common/core-templates/post-build/post-build.yml b/eng/common/core-templates/post-build/post-build.yml index f6f87fe5c675..55361908c2e9 100644 --- a/eng/common/core-templates/post-build/post-build.yml +++ b/eng/common/core-templates/post-build/post-build.yml @@ -307,6 +307,11 @@ stages: - task: NuGetAuthenticate@1 + # Darc is targeting 8.0, so make sure it's installed + - task: UseDotNet@2 + inputs: + version: 8.0.x + - task: AzureCLI@2 displayName: Publish Using Darc inputs: diff --git a/global.json b/global.json index f872f5e4b4d4..e137a6274ec6 100644 --- a/global.json +++ b/global.json @@ -27,9 +27,9 @@ "jdk": "latest" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25555.106", - "Microsoft.DotNet.Helix.Sdk": "10.0.0-beta.25555.106", - "Microsoft.DotNet.SharedFramework.Sdk": "10.0.0-beta.25555.106", + "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25562.108", + "Microsoft.DotNet.Helix.Sdk": "10.0.0-beta.25562.108", + "Microsoft.DotNet.SharedFramework.Sdk": "10.0.0-beta.25562.108", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0", "Microsoft.WixToolset.Sdk": "5.0.2-dotnet.2811440" diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStream.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStream.cs index 216eb9fc09b9..1e0c5821d3df 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStream.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStream.cs @@ -65,6 +65,12 @@ public Http3ControlStream(Http3StreamContext context, long? headerType) context.ClientPeerSettings, this); _frameWriter.Reset(context.Transport.Output, context.ConnectionId); + + _streamClosedFeature.OnClosed(static state => + { + var stream = (Http3ControlStream)state!; + stream.OnStreamClosed(); + }, this); } private void OnStreamClosed() @@ -135,12 +141,6 @@ private bool TryClose() internal async ValueTask ProcessOutboundSendsAsync(long id) { - _streamClosedFeature.OnClosed(static state => - { - var stream = (Http3ControlStream)state!; - stream.OnStreamClosed(); - }, this); - await _frameWriter.WriteStreamIdAsync(id); await _frameWriter.WriteSettingsAsync(_serverPeerSettings.GetNonProtocolDefaults()); } @@ -311,18 +311,13 @@ private async Task HandleControlStream() } } - private async ValueTask HandleEncodingDecodingTask() + private Task HandleEncodingDecodingTask() { // Noop encoding and decoding task. Settings make it so we don't need to read content of encoder and decoder. // An endpoint MUST allow its peer to create an encoder stream and a // decoder stream even if the connection's settings prevent their use. - while (_isClosed == 0) - { - var result = await Input.ReadAsync(); - var readableBuffer = result.Buffer; - Input.AdvanceTo(readableBuffer.End); - } + return Input.CopyToAsync(Stream.Null); } private ValueTask ProcessHttp3ControlStream(Http3RawFrame incomingFrame, bool isContinuedFrame, in ReadOnlySequence payload, out SequencePosition consumed) @@ -372,11 +367,6 @@ private ValueTask ProcessSettingsFrameAsync(bool isContinuedFrame, ReadOnlySeque } _haveReceivedSettingsFrame = true; - _streamClosedFeature.OnClosed(static state => - { - var stream = (Http3ControlStream)state!; - stream.OnStreamClosed(); - }, this); } while (true) diff --git a/src/Servers/Kestrel/shared/test/Http3/Http3InMemory.cs b/src/Servers/Kestrel/shared/test/Http3/Http3InMemory.cs index 5959bf150726..e6330862c905 100644 --- a/src/Servers/Kestrel/shared/test/Http3/Http3InMemory.cs +++ b/src/Servers/Kestrel/shared/test/Http3/Http3InMemory.cs @@ -300,12 +300,26 @@ public void OnInboundControlStreamSetting(Http3SettingType type, long value) public bool OnInboundDecoderStream(Server.Kestrel.Core.Internal.Http3.Http3ControlStream stream) { - return _inner.OnInboundDecoderStream(stream); + var res = _inner.OnInboundDecoderStream(stream); + + if (_http3TestBase._runningStreams.TryGetValue(stream.StreamId, out var testStream)) + { + testStream.OnDecoderStreamCreatedTcs.TrySetResult(); + } + + return res; } public bool OnInboundEncoderStream(Server.Kestrel.Core.Internal.Http3.Http3ControlStream stream) { - return _inner.OnInboundEncoderStream(stream); + var res = _inner.OnInboundEncoderStream(stream); + + if (_http3TestBase._runningStreams.TryGetValue(stream.StreamId, out var testStream)) + { + testStream.OnEncoderStreamCreatedTcs.TrySetResult(); + } + + return res; } public void OnStreamCompleted(IHttp3Stream stream) @@ -479,6 +493,8 @@ internal class Http3StreamBase internal TaskCompletionSource OnStreamCreatedTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); internal TaskCompletionSource OnStreamCompletedTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); internal TaskCompletionSource OnHeaderReceivedTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + internal TaskCompletionSource OnDecoderStreamCreatedTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + internal TaskCompletionSource OnEncoderStreamCreatedTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); internal TestStreamContext StreamContext { get; } internal DuplexPipe.DuplexPipePair Pair { get; } @@ -495,6 +511,8 @@ public long Error public Task OnStreamCreatedTask => OnStreamCreatedTcs.Task; public Task OnStreamCompletedTask => OnStreamCompletedTcs.Task; public Task OnHeaderReceivedTask => OnHeaderReceivedTcs.Task; + public Task OnDecoderStreamCreatedTask => OnDecoderStreamCreatedTcs.Task; + public Task OnEncoderStreamCreatedTask => OnEncoderStreamCreatedTcs.Task; public ConnectionAbortedException AbortReadException => StreamContext.AbortReadException; public ConnectionAbortedException AbortWriteException => StreamContext.AbortWriteException; diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3ConnectionTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3ConnectionTests.cs index ab8bc5e9a1e6..5bcf9e8b89ac 100644 --- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3ConnectionTests.cs +++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3ConnectionTests.cs @@ -768,6 +768,59 @@ public async Task ErrorCodeIsValidOnConnectionTimeout() Assert.InRange(errorCodeFeature.Error, 0, (1L << 62) - 1); // Valid range for HTTP/3 error codes } + [Theory] + [InlineData(2)] // encoder + [InlineData(3)] // decoder + public async Task IgnoredControlStreams_CloseConnectionOnEndStream(int streamType) + { + await Http3Api.InitializeConnectionAsync(_noopApplication); + + var stream = await Http3Api.CreateControlStream(streamType); + + // PipeWriter will be completed when end of stream is received. Should exit read loop and close stream + // which will cause the connection to close with an error. + await stream.SendFrameAsync(Http3FrameType.Data, Memory.Empty, endStream: true); + + await stream.OnStreamCompletedTask.DefaultTimeout(); + + Http3Api.TriggerTick(); + Http3Api.TriggerTick(TimeSpan.FromSeconds(1)); + + await Http3Api.WaitForConnectionErrorAsync( + ignoreNonGoAwayFrames: true, + expectedLastStreamId: 0, + expectedErrorCode: Http3ErrorCode.ClosedCriticalStream, + matchExpectedErrorMessage: AssertExpectedErrorMessages, + expectedErrorMessage: CoreStrings.Http3ErrorControlStreamClosed); + MetricsAssert.Equal(ConnectionEndReason.ClosedCriticalStream, Http3Api.ConnectionTags); + } + + [Theory] + [InlineData(2)] // encoder + [InlineData(3)] // decoder + public async Task IgnoredControlStreams_CloseConnectionOnStreamClose(int streamType) + { + await Http3Api.InitializeConnectionAsync(_noopApplication); + + var stream = await Http3Api.CreateControlStream(streamType); + + await (streamType == 2 ? stream.OnEncoderStreamCreatedTask : stream.OnDecoderStreamCreatedTask).DefaultTimeout(); + + // Simulate quic layer closing the stream + stream.StreamContext.Close(); + + Http3Api.TriggerTick(); + Http3Api.TriggerTick(TimeSpan.FromSeconds(1)); + + await Http3Api.WaitForConnectionErrorAsync( + ignoreNonGoAwayFrames: true, + expectedLastStreamId: 0, + expectedErrorCode: Http3ErrorCode.ClosedCriticalStream, + matchExpectedErrorMessage: AssertExpectedErrorMessages, + expectedErrorMessage: CoreStrings.Http3ErrorControlStreamClosed); + MetricsAssert.Equal(ConnectionEndReason.ClosedCriticalStream, Http3Api.ConnectionTags); + } + private sealed class ThrowingMultiplexedConnectionContext : TestMultiplexedConnectionContext { private int _skipCount;