Skip to content

Conversation

@DeagleGross
Copy link
Member

Backport of #63873 to release/9.0

(http2): Lower WINDOWS_UPDATE received on (half)closed stream to stream abortion

Change affects the server HTTP/2 behavior in the case client sends the RST_STREAM frame (moving stream to half-closed or closed state) and then sends another packet - WINDOW_UPDATE. Server behavior varies in this case (RFC HTTP/2 does not describe this case extremely clear) - for example HTTP.SYS does interpet this as a stream-level error (ignore of WINDOW_UPDATE packet); but Kestrel is more strict and sends the GO_AWAY packet closing not only the stream, but also the whole connection.

Such restrictive behavior of Kestrel impacts the client, which observes cancellations and has to re-establish the connection frequently.

Fixes #63726

Customer Impact

1P Customer which processes intensive traffic of another 1P customer with a Golang-based client observes high volume of cancellations. This not only impacts the performance where a new connection has to be established, but also means all streams existing on the connection were lost, resulting in bunch of customers seeing high latency.

Regression?

  • Yes
  • No

Risk

  • High
  • Medium
  • Low

Small change in behavior making Kestrel less restrictive. Also is being tested by the 1P team.

Verification

  • Manual (required)
  • Automated

Packaging changes reviewed?

  • Yes
  • No
  • N/A

When servicing release/2.3

  • Make necessary changes in eng/PatchConfig.props

@DeagleGross DeagleGross requested a review from halter73 as a code owner October 6, 2025 11:37
Copilot AI review requested due to automatic review settings October 6, 2025 11:37
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR modifies Kestrel's HTTP/2 behavior to be less restrictive when handling WINDOW_UPDATE frames received on closed/half-closed streams. Instead of aborting the entire connection, it now treats this as a stream-level error, which improves compatibility with clients and reduces connection churn.

  • Changed WINDOW_UPDATE frame handling on reset streams from connection abortion to stream-level error
  • Updated test expectations to reflect the new stream-level error behavior instead of connection-level errors
  • Removed quarantine annotation from related test case

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs Modified WINDOW_UPDATE frame processing to throw stream error instead of connection abort
src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2ConnectionTests.cs Updated test to expect stream error and removed quarantine annotation

@dotnet-policy-service dotnet-policy-service bot added this to the 9.0.x milestone Oct 6, 2025
@wtgodbe wtgodbe added Servicing-approved Shiproom has approved the issue Servicing-consider Shiproom approval is required for the issue and removed Servicing-approved Shiproom has approved the issue labels Oct 6, 2025
@rbhanda rbhanda modified the milestones: 9.0.x, 9.0.11 Oct 7, 2025
@rbhanda rbhanda added Servicing-approved Shiproom has approved the issue and removed Servicing-consider Shiproom approval is required for the issue labels Oct 7, 2025
@wtgodbe
Copy link
Member

wtgodbe commented Oct 7, 2025

Failure unrelated

github-actions bot pushed a commit to saan800/saansoft-correlationid that referenced this pull request Dec 31, 2025
….Extensions.Logging.Abstractions (#178)

Updated
[Microsoft.AspNetCore.TestHost](https://github.com/dotnet/aspnetcore)
from 9.0.9 to 9.0.11.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.AspNetCore.TestHost's
releases](https://github.com/dotnet/aspnetcore/releases)._

## 9.0.11

[Release](https://github.com/dotnet/core/releases/tag/v9.0.11)

## What's Changed
* Update branding to 9.0.11 by @​vseanreesermsft in
dotnet/aspnetcore#63950
* [release/9.0] Update dependencies from dotnet/extensions by
@​dotnet-maestro[bot] in dotnet/aspnetcore#63677
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/aspnetcore#63678
* [release/9.0] (deps): Bump src/submodules/googletest from `eb2d85e` to
`9706f75` by @​dependabot[bot] in
dotnet/aspnetcore#63894
* [release/9.0] Fixed devtools url used for debug with chrome and edge
by @​github-actions[bot] in
dotnet/aspnetcore#61948
* [release/9.0] (http2): Lower WINDOWS_UPDATE received on (half)closed
stream to stream abortion by @​DeagleGross in
dotnet/aspnetcore#63934
* [release/9.0] Re-quarantine
ServerRoutingTest.NavigationLock_OverlappingNavigationsCancelExistingNavigations_HistoryNavigation
by @​github-actions[bot] in
dotnet/aspnetcore#63956
* [release/9.0] Fix nginx install on mac, linux by @​wtgodbe in
dotnet/aspnetcore#63966
* [Hot Reload] Do not attempt to apply empty deltas. by @​tmat in
dotnet/aspnetcore#63979
* Merging internal commits for release/9.0 by @​vseanreesermsft in
dotnet/aspnetcore#64036
* Revert log level severity for unknown proxy in
ForwardedHeadersMiddleware by @​BrennanConroy in
dotnet/aspnetcore#64091
* Set timeoutInMinutes to 0 for Windows build job by @​vseanreesermsft
in dotnet/aspnetcore#64126


**Full Changelog**:
dotnet/aspnetcore@v9.0.10...v9.0.11

## 9.0.10

[Release](https://github.com/dotnet/core/releases/tag/v9.0.10)

## What's Changed
* Update branding to 9.0.10 by @​vseanreesermsft in
dotnet/aspnetcore#63510
* [9.0] Make duplicate deb/rpm packages so we can sign them with the new
PMC key by @​jkoritzinsky in
dotnet/aspnetcore#63249
* [release/9.0] Extend Unofficial 1ES template in IdentityModel nightly
tests job by @​github-actions[bot] in
dotnet/aspnetcore#63465
* [release/9.0] (deps): Bump src/submodules/googletest from `373af2e` to
`eb2d85e` by @​dependabot[bot] in
dotnet/aspnetcore#63501
* [release/9.0] Quarantine ResponseBody_WriteContentLength_PassedThrough
by @​wtgodbe in dotnet/aspnetcore#63533
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/aspnetcore#63304
* [release/9.0] [OpenAPI] Use invariant culture for TextWriter by
@​martincostello in dotnet/aspnetcore#62239
* [release/9.0] Update dependencies from dotnet/extensions by
@​dotnet-maestro[bot] in dotnet/aspnetcore#63303
* Unquarantine `RadioButtonGetsResetAfterSubmittingEnhancedForm` by
@​ilonatommy in dotnet/aspnetcore#63556
* [release/9.0] Update dependencies from dotnet/extensions by
@​dotnet-maestro[bot] in dotnet/aspnetcore#63577
* Merging internal commits for release/9.0 by @​vseanreesermsft in
dotnet/aspnetcore#63604
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/aspnetcore#63648
* backport(9.0): Fix runtime architecture detection logic in ANCM. by
@​DeagleGross in dotnet/aspnetcore#63707


**Full Changelog**:
dotnet/aspnetcore@v9.0.9...v9.0.10

Commits viewable in [compare
view](dotnet/aspnetcore@v9.0.9...v9.0.11).
</details>

Updated
[Microsoft.Extensions.Logging.Abstractions](https://github.com/dotnet/runtime)
from 9.0.9 to 9.0.11.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Logging.Abstractions's
releases](https://github.com/dotnet/runtime/releases)._

## 9.0.11

[Release](https://github.com/dotnet/core/releases/tag/v9.0.11)

## What's Changed
* [release/9.0-staging] Fix DefaultIfEmptyIterator.TryGetElementAt
returning default value for out-of-bounds indices by
@​github-actions[bot] in dotnet/runtime#119844
* [release/9.0-staging] Update dependencies from dotnet/cecil by
@​dotnet-maestro[bot] in dotnet/runtime#119981
* [automated] Merge branch 'release/9.0' => 'release/9.0-staging' by
@​github-actions[bot] in dotnet/runtime#119978
* [release/9.0-staging] Add acquire barrier to populate bit reading by
@​github-actions[bot] in dotnet/runtime#119967
* [release/9.0-staging] Bump System.Text.Json toolset version by
@​github-actions[bot] in dotnet/runtime#113385
* [release/9.0-staging] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/runtime#120034
* [release/9.0-staging] Update dependencies from dotnet/cecil by
@​dotnet-maestro[bot] in dotnet/runtime#120033
* [release/9.0-staging] Update dependencies from
dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in
dotnet/runtime#120020
* [release/9.0-staging] `UnsafeAccessor` - ambiguous name and signature
match by @​AaronRobinsonMSFT in
dotnet/runtime#120011
* [release/9.0] Bump OSX.12 helix queues to OSX.13 by @​steveisok in
dotnet/runtime#119814
* [release/9.0-staging] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/runtime#120128
* [release/9.0-staging] Update dependencies from dotnet/cecil by
@​dotnet-maestro[bot] in dotnet/runtime#120129
* [release/9.0-staging] Update dependencies from
dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in
dotnet/runtime#120106
* [automated] Merge branch 'release/9.0' => 'release/9.0-staging' by
@​github-actions[bot] in dotnet/runtime#120057
* [release/9.0-staging] Update dependencies from dotnet/cecil by
@​dotnet-maestro[bot] in dotnet/runtime#120240
* [release/9.0] [mono] Make the compressed interface bitmap feature
usable by @​BrzVlad in dotnet/runtime#120154
* [release/9.0-staging] Remove an STJ deep nested object test causing
occasional failures by @​github-actions[bot] in
dotnet/runtime#120265
* [release/9.0-staging] Update dependencies from dotnet/hotreload-utils
by @​dotnet-maestro[bot] in
dotnet/runtime#120331
* [release/9.0-staging] Detect if RSA-384 is supported on the platform
by @​vcsjones in dotnet/runtime#120382
* [release/9.0-staging] Load Standalone GC correctly in component
scenarios. by @​github-actions[bot] in
dotnet/runtime#120236
* [release/9.0-staging] [mono][hotreload] Make the runtime ignore an
update if it is an empty one by @​github-actions[bot] in
dotnet/runtime#120335
* [release/9.0-staging] Update dependencies from dotnet/icu by
@​dotnet-maestro[bot] in dotnet/runtime#120349
* [release/9.0-staging] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/runtime#120397
* [release/9.0-staging] Update dependencies from dotnet/cecil by
@​dotnet-maestro[bot] in dotnet/runtime#120418
* [release/9.0-staging] Update dependencies from dotnet/xharness by
@​dotnet-maestro[bot] in dotnet/runtime#120425
* [release/9.0-staging] Update dependencies from dotnet/hotreload-utils
by @​dotnet-maestro[bot] in
dotnet/runtime#120404
* [release/9.0-staging] Prevent format injection in hosting Windows PAL
printf functions when redirected to file by @​jkoritzinsky in
dotnet/runtime#119786
* [release/9.0-staging] Update dependencies from dotnet/runtime-assets
by @​dotnet-maestro[bot] in
dotnet/runtime#120417
* Update branding to 9.0.11 by @​vseanreesermsft in
dotnet/runtime#120474
* [release/9.0-staging] Update dependencies from dotnet/icu by
@​dotnet-maestro[bot] in dotnet/runtime#120586
* [release/9.0] Update dependencies from dotnet/emsdk by
@​dotnet-maestro[bot] in dotnet/runtime#120409
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/runtime#120396
* [release/9.0-staging] [mono][interp] Fix various leaks, primarily
around dynamic methods by @​BrzVlad in
dotnet/runtime#120600
* [release/9.0-staging] [mono][sgen] Fix incorrect condition when
checking if we should do a major collection by @​github-actions[bot] in
dotnet/runtime#120533
* [automated] Merge branch 'release/9.0' => 'release/9.0-staging' by
@​github-actions[bot] in dotnet/runtime#120570
* [manual] Merge release/9.0-staging into release/9.0 by
@​PranavSenthilnathan in dotnet/runtime#120615
* Merging internal commits for release/9.0 by @​vseanreesermsft in
dotnet/runtime#120719
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/runtime#120765
* [release/9.0] Update dependencies from dotnet/emsdk by
@​dotnet-maestro[bot] in dotnet/runtime#120779
* [release/9.0] Update dependencies from dotnet/emsdk by
@​dotnet-maestro[bot] in dotnet/runtime#120814
* [release/9.0] Update Microsoft.Build.* versions to 17.8.43 by
@​PranavSenthilnathan in dotnet/runtime#120820


**Full Changelog**:
dotnet/runtime@v9.0.10...v9.0.11

## 9.0.10

[Release](https://github.com/dotnet/runtime/releases/tag/v9.0.9)

## What's Changed
* [release/9.0-staging] Disable release assert on disallowed thread
re-initialization for managed C++ by @​github-actions[bot] in
dotnet/runtime#118842
* [release/9.0-staging] [wasm][AOT] fix codegen for small structs on
stack by @​github-actions[bot] in
dotnet/runtime#118416
* Update branding to 9.0.10 by @​vseanreesermsft in
dotnet/runtime#119280
* [release/9.0-staging] Don't use vfork on android by
@​github-actions[bot] in dotnet/runtime#118331
* [release/9.0-staging] [mono][debugger] Fix assertion when stepping by
@​github-actions[bot] in dotnet/runtime#118459
* [release/9.0-staging][maccatalyst] Check for -Wno-overriding-option
for compatibility with clang in Xcode 16.3+ by @​akoeplinger in
dotnet/runtime#119301
* [release/9.0-staging][HTTP] Stress fix for docker compose by
@​ManickaP in dotnet/runtime#119455
* Merging internal commits for release/9.0 by @​vseanreesermsft in
dotnet/runtime#119505
* [9.0] Preserve Lock ID Members by @​jkoritzinsky in
dotnet/runtime#119281
* [release/9.0] Update dependencies from dotnet/emsdk by
@​dotnet-maestro[bot] in dotnet/runtime#118940
* [release/9.0-staging] Update dependencies from dotnet/hotreload-utils
by @​dotnet-maestro[bot] in
dotnet/runtime#118151
* [release/9.0-staging] Update dependencies from dotnet/cecil by
@​dotnet-maestro[bot] in dotnet/runtime#118372
* [release/9.0-staging] Update dependencies from dotnet/icu by
@​dotnet-maestro[bot] in dotnet/runtime#118423
* [release/9.0-staging] Update dependencies from dotnet/roslyn by
@​dotnet-maestro[bot] in dotnet/runtime#118193
* [release/9.0-staging] Update dependencies from dotnet/runtime-assets
by @​dotnet-maestro[bot] in
dotnet/runtime#118758
* [release/9.0-staging] Update dependencies from dotnet/icu by
@​dotnet-maestro[bot] in dotnet/runtime#119619
* [release/9.0-staging] Update dependencies from
dotnet/source-build-reference-packages by @​dotnet-maestro[bot] in
dotnet/runtime#119598
* [release/9.0-staging] Update dependencies from dotnet/cecil by
@​dotnet-maestro[bot] in dotnet/runtime#119620
* [release/9.0-staging] Update dependencies from dotnet/xharness by
@​dotnet-maestro[bot] in dotnet/runtime#119051
* [automated] Merge branch 'release/9.0' => 'release/9.0-staging' by
@​github-actions[bot] in dotnet/runtime#118492
* [release/9.0-staging] [H/3] Fix interop tests. by
@​github-actions[bot] in dotnet/runtime#119522
* [release/9.0-staging] Disable tests parallelization in flaky OleDB
tests by @​github-actions[bot] in
dotnet/runtime#119626
* [release/9.0-staging] Update dependencies from dotnet/icu by
@​dotnet-maestro[bot] in dotnet/runtime#119690
* [release/9.0-staging] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/runtime#118224
* [release/9.0-staging] Update dependencies from dotnet/runtime-assets
by @​dotnet-maestro[bot] in
dotnet/runtime#119677
* [release/9.0-staging] Update dependencies from dotnet/hotreload-utils
by @​dotnet-maestro[bot] in
dotnet/runtime#119635
* [release/9.0] Update dependencies from dotnet/emsdk by
@​dotnet-maestro[bot] in dotnet/runtime#119669
* [release/9.0-staging] Fix recursion issue found in PROCCreateCrashDump
by @​github-actions[bot] in
dotnet/runtime#119128
* [release/9.0-staging] Update dependencies from dotnet/cecil by
@​dotnet-maestro[bot] in dotnet/runtime#119742
* [automated] Merge branch 'release/9.0' => 'release/9.0-staging' by
@​github-actions[bot] in dotnet/runtime#119721
* [release/9.0] Update dependencies from dotnet/emsdk by
@​dotnet-maestro[bot] in dotnet/runtime#119753
* [release/9.0-staging] Update dependencies from dotnet/icu by
@​dotnet-maestro[bot] in dotnet/runtime#119793
* [release/9.0] Update dependencies from dotnet/emsdk by
@​dotnet-maestro[bot] in dotnet/runtime#119809
* [release/9.0-staging] Update dependencies from dotnet/icu by
@​dotnet-maestro[bot] in dotnet/runtime#119832
* [release/9.0-staging] Update dependencies from dotnet/roslyn by
@​dotnet-maestro[bot] in dotnet/runtime#119830
* Backport macOS 26 Tahoe test fixes to release/9.0-staging by
@​vcsjones in dotnet/runtime#119716
* [release/9.0-staging] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/runtime#119871
* [release/9.0-staging] Update dependencies from dotnet/icu by
@​dotnet-maestro[bot] in dotnet/runtime#119872
* [release/9.0-staging] Disable Multicast SocketOption test by
@​github-actions[bot] in dotnet/runtime#119889
* [release/9.0-staging] Update dependencies from dotnet/icu by
@​dotnet-maestro[bot] in dotnet/runtime#119932
* [release/9.0] Update dependencies from dotnet/emsdk by
@​dotnet-maestro[bot] in dotnet/runtime#119900
* [manual] Merge release/9.0-staging into release/9.0 by @​tarekgh in
dotnet/runtime#119966
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/runtime#120025
* [release/9.0] Update dependencies from dotnet/arcade by
@​dotnet-maestro[bot] in dotnet/runtime#120111


**Full Changelog**:
dotnet/runtime@v9.0.9...v9.0.10

Commits viewable in [compare
view](dotnet/runtime@v9.0.9...v9.0.11).
</details>

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This was referenced Jan 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Servicing-approved Shiproom has approved the issue

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants