HTTP/2: Ignore additional RST_STREAM frames sent to stream (#32449) (#32478)

This commit is contained in:
James Newton-King 2021-06-02 09:57:01 +12:00 committed by GitHub
parent c2b5828941
commit bfc145d038
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 5 deletions

View File

@ -718,8 +718,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
// Second reset
if (stream.RstStreamReceived)
{
// Hard abort, do not allow any more frames on this stream.
throw new Http2ConnectionErrorException(CoreStrings.FormatHttp2ErrorStreamAborted(_incomingFrame.Type, stream.StreamId), Http2ErrorCode.STREAM_CLOSED);
// https://tools.ietf.org/html/rfc7540#section-5.1
// If RST_STREAM has already been received then the stream is in a closed state.
// Additional frames (other than PRIORITY) are a stream error.
// The server will usually send a RST_STREAM for a stream error, but RST_STREAM
// shouldn't be sent in response to RST_STREAM to avoid a loop.
// The best course of action here is to do nothing.
return Task.CompletedTask;
}
// No additional inbound header or data frames are allowed for this stream after receiving a reset.

View File

@ -3048,7 +3048,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
}
[Fact]
public async Task RST_STREAM_IncompleteRequest_AdditionalResetFrame_ConnectionAborted()
public async Task RST_STREAM_IncompleteRequest_AdditionalResetFrame_IgnoreAdditionalReset()
{
var tcs = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
@ -3066,8 +3066,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
await SendRstStreamAsync(1);
tcs.TrySetResult(0);
await WaitForConnectionErrorAsync<Http2ConnectionErrorException>(ignoreNonGoAwayFrames: false, expectedLastStreamId: 1,
Http2ErrorCode.STREAM_CLOSED, CoreStrings.FormatHttp2ErrorStreamAborted(Http2FrameType.RST_STREAM, 1));
await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
}
[Fact]