Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1158,8 +1158,12 @@ private Task ProcessWindowUpdateFrameAsync()
{
if (stream.RstStreamReceived)
{
// Hard abort, do not allow any more frames on this stream.
throw CreateReceivedFrameStreamAbortedException(stream);
// WINDOW_UPDATE received after we have already processed an inbound RST_STREAM for this stream.
// RFC 7540 (Sections 5.1, 6.9) / RFC 9113 do not explicitly define semantics for WINDOW_UPDATE on a
// stream in the "closed" state due to a reset by client. We surface it as a stream error (STREAM_CLOSED)
// rather than aborting the entire connection to keep behavior deterministic and consistent with other servers.
// https://github.com/dotnet/aspnetcore/issues/63726
throw new Http2StreamErrorException(_incomingFrame.StreamId, CoreStrings.Http2StreamAborted, Http2ErrorCode.STREAM_CLOSED);
}

if (!stream.TryUpdateOutputWindow(_incomingFrame.WindowUpdateSizeIncrement))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3599,7 +3599,6 @@ public async Task RST_STREAM_IncompleteRequest_AdditionalResetFrame_IgnoreAdditi
AssertConnectionNoError();
}

[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/53744")]
[Fact]
public async Task RST_STREAM_IncompleteRequest_AdditionalWindowUpdateFrame_ConnectionAborted()
{
Expand All @@ -3618,10 +3617,12 @@ public async Task RST_STREAM_IncompleteRequest_AdditionalWindowUpdateFrame_Conne
await SendRstStreamAsync(1);
await SendWindowUpdateAsync(1, 1024);

await WaitForConnectionErrorAsync<Http2ConnectionErrorException>(ignoreNonGoAwayFrames: false, expectedLastStreamId: 1,
Http2ErrorCode.STREAM_CLOSED, CoreStrings.FormatHttp2ErrorStreamAborted(Http2FrameType.WINDOW_UPDATE, 1));
await WaitForStreamErrorAsync(expectedStreamId: 1, Http2ErrorCode.STREAM_CLOSED, CoreStrings.Http2StreamAborted);

tcs.TrySetResult(); // Don't let the response start until after the abort

await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
AssertConnectionNoError();
}

[Fact]
Expand Down
Loading