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;