HTTP/2: close connection with PROTOCOL_ERROR when an unknown frame type is interleaved with headers.
This commit is contained in:
parent
e2af346733
commit
555a881cb7
|
|
@ -218,9 +218,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
|
||||||
return ProcessWindowUpdateFrameAsync();
|
return ProcessWindowUpdateFrameAsync();
|
||||||
case Http2FrameType.CONTINUATION:
|
case Http2FrameType.CONTINUATION:
|
||||||
return ProcessContinuationFrameAsync<TContext>(application);
|
return ProcessContinuationFrameAsync<TContext>(application);
|
||||||
|
default:
|
||||||
|
return ProcessUnknownFrameAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task ProcessDataFrameAsync()
|
private Task ProcessDataFrameAsync()
|
||||||
|
|
@ -454,6 +454,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Task ProcessUnknownFrameAsync()
|
||||||
|
{
|
||||||
|
if (_currentHeadersStream != null)
|
||||||
|
{
|
||||||
|
throw new Http2ConnectionErrorException(Http2ErrorCode.PROTOCOL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
void IHttp2StreamLifetimeHandler.OnStreamCompleted(int streamId)
|
void IHttp2StreamLifetimeHandler.OnStreamCompleted(int streamId)
|
||||||
{
|
{
|
||||||
_streams.TryRemove(streamId, out _);
|
_streams.TryRemove(streamId, out _);
|
||||||
|
|
|
||||||
|
|
@ -1062,6 +1062,34 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
Assert.Equal(_largeHeaderB, responseHeadersDictionary["b"]);
|
Assert.Equal(_largeHeaderB, responseHeadersDictionary["b"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task UnknownFrameType_Received_Ignored()
|
||||||
|
{
|
||||||
|
await InitializeConnectionAsync(_noopApplication);
|
||||||
|
|
||||||
|
await SendUnknownFrameTypeAsync(streamId: 1);
|
||||||
|
|
||||||
|
// Check that the connection is still alive
|
||||||
|
await SendPingAsync();
|
||||||
|
await ExpectAsync(Http2FrameType.PING,
|
||||||
|
withLength: 8,
|
||||||
|
withFlags: (byte)Http2PingFrameFlags.ACK,
|
||||||
|
withStreamId: 0);
|
||||||
|
|
||||||
|
await StopConnectionAsync(0, ignoreNonGoAwayFrames: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task UnknownFrameType_Received_InterleavedWithHeaders_ConnectionError()
|
||||||
|
{
|
||||||
|
await InitializeConnectionAsync(_noopApplication);
|
||||||
|
|
||||||
|
await SendHeadersAsync(1, Http2HeadersFrameFlags.NONE, _browserRequestHeaders);
|
||||||
|
await SendUnknownFrameTypeAsync(streamId: 1);
|
||||||
|
|
||||||
|
await WaitForConnectionErrorAsync(expectedLastStreamId: 0, expectedErrorCode: Http2ErrorCode.PROTOCOL_ERROR, ignoreNonGoAwayFrames: false);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task ConnectionError_AbortsAllStreams()
|
public async Task ConnectionError_AbortsAllStreams()
|
||||||
{
|
{
|
||||||
|
|
@ -1451,6 +1479,15 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
return SendAsync(frame.Raw);
|
return SendAsync(frame.Raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Task SendUnknownFrameTypeAsync(int streamId)
|
||||||
|
{
|
||||||
|
var frame = new Http2Frame();
|
||||||
|
frame.StreamId = streamId;
|
||||||
|
frame.Type = (Http2FrameType)42;
|
||||||
|
frame.Length = 0;
|
||||||
|
return SendAsync(frame.Raw);
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<Http2Frame> ReceiveFrameAsync()
|
private async Task<Http2Frame> ReceiveFrameAsync()
|
||||||
{
|
{
|
||||||
var frame = new Http2Frame();
|
var frame = new Http2Frame();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue