Reset KeepAliveTimeout on HTTP/2 ping (#24644)
This commit is contained in:
parent
942b6de03d
commit
5fbd1eb007
|
|
@ -808,6 +808,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
|
||||||
throw new Http2ConnectionErrorException(CoreStrings.FormatHttp2ErrorUnexpectedFrameLength(_incomingFrame.Type, 8), Http2ErrorCode.FRAME_SIZE_ERROR);
|
throw new Http2ConnectionErrorException(CoreStrings.FormatHttp2ErrorUnexpectedFrameLength(_incomingFrame.Type, 8), Http2ErrorCode.FRAME_SIZE_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Incoming ping resets connection keep alive timeout
|
||||||
|
if (TimeoutControl.TimerReason == TimeoutReason.KeepAlive)
|
||||||
|
{
|
||||||
|
TimeoutControl.ResetTimeout(Limits.KeepAliveTimeout.Ticks, TimeoutReason.KeepAlive);
|
||||||
|
}
|
||||||
|
|
||||||
if (_incomingFrame.PingAck)
|
if (_incomingFrame.PingAck)
|
||||||
{
|
{
|
||||||
// TODO: verify that payload is equal to the outgoing PING frame
|
// TODO: verify that payload is equal to the outgoing PING frame
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,64 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
_mockTimeoutHandler.VerifyNoOtherCalls();
|
_mockTimeoutHandler.VerifyNoOtherCalls();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task PING_WithinKeepAliveTimeout_ResetKeepAliveTimeout()
|
||||||
|
{
|
||||||
|
var mockSystemClock = _serviceContext.MockSystemClock;
|
||||||
|
var limits = _serviceContext.ServerOptions.Limits;
|
||||||
|
|
||||||
|
_timeoutControl.Initialize(mockSystemClock.UtcNow.Ticks);
|
||||||
|
|
||||||
|
CreateConnection();
|
||||||
|
|
||||||
|
await InitializeConnectionAsync(_noopApplication);
|
||||||
|
|
||||||
|
// Connection starts and sets keep alive timeout
|
||||||
|
_mockTimeoutControl.Verify(c => c.SetTimeout(It.IsAny<long>(), TimeoutReason.KeepAlive), Times.Once);
|
||||||
|
_mockTimeoutControl.Verify(c => c.ResetTimeout(It.IsAny<long>(), TimeoutReason.KeepAlive), Times.Never);
|
||||||
|
|
||||||
|
await SendPingAsync(Http2PingFrameFlags.NONE);
|
||||||
|
await ExpectAsync(Http2FrameType.PING,
|
||||||
|
withLength: 8,
|
||||||
|
withFlags: (byte)Http2PingFrameFlags.ACK,
|
||||||
|
withStreamId: 0);
|
||||||
|
|
||||||
|
// Server resets keep alive timeout
|
||||||
|
_mockTimeoutControl.Verify(c => c.ResetTimeout(It.IsAny<long>(), TimeoutReason.KeepAlive), Times.Once);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task PING_NoKeepAliveTimeout_DoesNotResetKeepAliveTimeout()
|
||||||
|
{
|
||||||
|
var mockSystemClock = _serviceContext.MockSystemClock;
|
||||||
|
var limits = _serviceContext.ServerOptions.Limits;
|
||||||
|
|
||||||
|
_timeoutControl.Initialize(mockSystemClock.UtcNow.Ticks);
|
||||||
|
|
||||||
|
CreateConnection();
|
||||||
|
|
||||||
|
await InitializeConnectionAsync(_noopApplication);
|
||||||
|
|
||||||
|
// Connection starts and sets keep alive timeout
|
||||||
|
_mockTimeoutControl.Verify(c => c.SetTimeout(It.IsAny<long>(), TimeoutReason.KeepAlive), Times.Once);
|
||||||
|
_mockTimeoutControl.Verify(c => c.ResetTimeout(It.IsAny<long>(), TimeoutReason.KeepAlive), Times.Never);
|
||||||
|
_mockTimeoutControl.Verify(c => c.CancelTimeout(), Times.Never);
|
||||||
|
|
||||||
|
await StartStreamAsync(1, _browserRequestHeaders, endStream: false);
|
||||||
|
|
||||||
|
// Starting a stream cancels the keep alive timeout
|
||||||
|
_mockTimeoutControl.Verify(c => c.CancelTimeout(), Times.Once);
|
||||||
|
|
||||||
|
await SendPingAsync(Http2PingFrameFlags.NONE);
|
||||||
|
await ExpectAsync(Http2FrameType.PING,
|
||||||
|
withLength: 8,
|
||||||
|
withFlags: (byte)Http2PingFrameFlags.ACK,
|
||||||
|
withStreamId: 0);
|
||||||
|
|
||||||
|
// Server doesn't reset keep alive timeout because it isn't running
|
||||||
|
_mockTimeoutControl.Verify(c => c.ResetTimeout(It.IsAny<long>(), TimeoutReason.KeepAlive), Times.Never);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task HEADERS_ReceivedWithoutAllCONTINUATIONs_WithinRequestHeadersTimeout_AbortsConnection()
|
public async Task HEADERS_ReceivedWithoutAllCONTINUATIONs_WithinRequestHeadersTimeout_AbortsConnection()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue