HTTP/2: close connection with PROTOCOL_ERROR when an unknown frame type is interleaved with headers.

This commit is contained in:
Cesar Blum Silveira 2017-09-21 09:49:15 -07:00 committed by Cesar Blum Silveira
parent e2af346733
commit 555a881cb7
2 changed files with 49 additions and 2 deletions

View File

@ -218,9 +218,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
return ProcessWindowUpdateFrameAsync();
case Http2FrameType.CONTINUATION:
return ProcessContinuationFrameAsync<TContext>(application);
default:
return ProcessUnknownFrameAsync();
}
return Task.CompletedTask;
}
private Task ProcessDataFrameAsync()
@ -454,6 +454,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
return Task.CompletedTask;
}
private Task ProcessUnknownFrameAsync()
{
if (_currentHeadersStream != null)
{
throw new Http2ConnectionErrorException(Http2ErrorCode.PROTOCOL_ERROR);
}
return Task.CompletedTask;
}
void IHttp2StreamLifetimeHandler.OnStreamCompleted(int streamId)
{
_streams.TryRemove(streamId, out _);

View File

@ -1062,6 +1062,34 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
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]
public async Task ConnectionError_AbortsAllStreams()
{
@ -1451,6 +1479,15 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
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()
{
var frame = new Http2Frame();