Remove limits on SETTINGS_HEADER_TABLE_SIZE #2874
This commit is contained in:
parent
8f6cb72ef2
commit
991cfa8bd8
|
|
@ -2,6 +2,7 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.Kestrel.Core
|
namespace Microsoft.AspNetCore.Server.Kestrel.Core
|
||||||
{
|
{
|
||||||
|
|
@ -11,11 +12,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core
|
||||||
public class Http2Limits
|
public class Http2Limits
|
||||||
{
|
{
|
||||||
private int _maxStreamsPerConnection = 100;
|
private int _maxStreamsPerConnection = 100;
|
||||||
private int _headerTableSize = MaxAllowedHeaderTableSize;
|
private int _headerTableSize = (int)Http2PeerSettings.DefaultHeaderTableSize;
|
||||||
private int _maxFrameSize = MinAllowedMaxFrameSize;
|
private int _maxFrameSize = MinAllowedMaxFrameSize;
|
||||||
|
|
||||||
// These are limits defined by the RFC https://tools.ietf.org/html/rfc7540#section-4.2
|
// These are limits defined by the RFC https://tools.ietf.org/html/rfc7540#section-4.2
|
||||||
public const int MaxAllowedHeaderTableSize = 4096;
|
|
||||||
public const int MinAllowedMaxFrameSize = 16 * 1024;
|
public const int MinAllowedMaxFrameSize = 16 * 1024;
|
||||||
public const int MaxAllowedMaxFrameSize = 16 * 1024 * 1024 - 1;
|
public const int MaxAllowedMaxFrameSize = 16 * 1024 * 1024 - 1;
|
||||||
|
|
||||||
|
|
@ -50,9 +50,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core
|
||||||
get => _headerTableSize;
|
get => _headerTableSize;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (value <= 0 || value > MaxAllowedHeaderTableSize)
|
if (value <= 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentOutOfRangeException(nameof(value), value, CoreStrings.FormatArgumentOutOfRange(0, MaxAllowedHeaderTableSize));
|
throw new ArgumentOutOfRangeException(nameof(value), value, CoreStrings.GreaterThanZeroRequired);
|
||||||
}
|
}
|
||||||
|
|
||||||
_headerTableSize = value;
|
_headerTableSize = value;
|
||||||
|
|
|
||||||
|
|
@ -38,12 +38,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
|
||||||
switch (setting.Parameter)
|
switch (setting.Parameter)
|
||||||
{
|
{
|
||||||
case Http2SettingsParameter.SETTINGS_HEADER_TABLE_SIZE:
|
case Http2SettingsParameter.SETTINGS_HEADER_TABLE_SIZE:
|
||||||
if (value > Http2Limits.MaxAllowedHeaderTableSize)
|
|
||||||
{
|
|
||||||
throw new Http2SettingsParameterOutOfRangeException(Http2SettingsParameter.SETTINGS_HEADER_TABLE_SIZE,
|
|
||||||
lowerBound: 0,
|
|
||||||
upperBound: Http2Limits.MaxAllowedHeaderTableSize);
|
|
||||||
}
|
|
||||||
HeaderTableSize = value;
|
HeaderTableSize = value;
|
||||||
break;
|
break;
|
||||||
case Http2SettingsParameter.SETTINGS_ENABLE_PUSH:
|
case Http2SettingsParameter.SETTINGS_ENABLE_PUSH:
|
||||||
|
|
|
||||||
|
|
@ -2100,7 +2100,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
[InlineData(Http2SettingsParameter.SETTINGS_MAX_FRAME_SIZE, 16 * 1024 - 1, Http2ErrorCode.PROTOCOL_ERROR)]
|
[InlineData(Http2SettingsParameter.SETTINGS_MAX_FRAME_SIZE, 16 * 1024 - 1, Http2ErrorCode.PROTOCOL_ERROR)]
|
||||||
[InlineData(Http2SettingsParameter.SETTINGS_MAX_FRAME_SIZE, 16 * 1024 * 1024, Http2ErrorCode.PROTOCOL_ERROR)]
|
[InlineData(Http2SettingsParameter.SETTINGS_MAX_FRAME_SIZE, 16 * 1024 * 1024, Http2ErrorCode.PROTOCOL_ERROR)]
|
||||||
[InlineData(Http2SettingsParameter.SETTINGS_MAX_FRAME_SIZE, uint.MaxValue, Http2ErrorCode.PROTOCOL_ERROR)]
|
[InlineData(Http2SettingsParameter.SETTINGS_MAX_FRAME_SIZE, uint.MaxValue, Http2ErrorCode.PROTOCOL_ERROR)]
|
||||||
[InlineData(Http2SettingsParameter.SETTINGS_HEADER_TABLE_SIZE, 4097, Http2ErrorCode.PROTOCOL_ERROR)]
|
|
||||||
public async Task SETTINGS_Received_InvalidParameterValue_ConnectionError(Http2SettingsParameter parameter, uint value, Http2ErrorCode expectedErrorCode)
|
public async Task SETTINGS_Received_InvalidParameterValue_ConnectionError(Http2SettingsParameter parameter, uint value, Http2ErrorCode expectedErrorCode)
|
||||||
{
|
{
|
||||||
await InitializeConnectionAsync(_noopApplication);
|
await InitializeConnectionAsync(_noopApplication);
|
||||||
|
|
@ -2242,6 +2241,24 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
|
await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task SETTINGS_Received_ChangesHeaderTableSize()
|
||||||
|
{
|
||||||
|
await InitializeConnectionAsync(_noopApplication);
|
||||||
|
|
||||||
|
// Update client settings
|
||||||
|
_clientSettings.HeaderTableSize = 65536; // Chrome's default, larger than the 4kb spec default
|
||||||
|
await SendSettingsAsync();
|
||||||
|
|
||||||
|
// ACK
|
||||||
|
await ExpectAsync(Http2FrameType.SETTINGS,
|
||||||
|
withLength: 0,
|
||||||
|
withFlags: (byte)Http2SettingsFrameFlags.ACK,
|
||||||
|
withStreamId: 0);
|
||||||
|
|
||||||
|
await StopConnectionAsync(expectedLastStreamId: 0, ignoreNonGoAwayFrames: false);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task PUSH_PROMISE_Received_ConnectionError()
|
public async Task PUSH_PROMISE_Received_ConnectionError()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue