Initialize Heartbeat in KestrelServer.StartAsync (#2939)
Fixes #2850 again
This commit is contained in:
parent
a7e412ec80
commit
f3b6430aab
|
|
@ -118,6 +118,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Performance
|
||||||
|
|
||||||
http1Connection.Reset();
|
http1Connection.Reset();
|
||||||
http1Connection.InitializeStreams(MessageBody.ZeroContentLengthKeepAlive);
|
http1Connection.InitializeStreams(MessageBody.ZeroContentLengthKeepAlive);
|
||||||
|
serviceContext.DateHeaderValueManager.OnHeartbeat(DateTimeOffset.UtcNow);
|
||||||
|
|
||||||
return http1Connection;
|
return http1Connection;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
// 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.Buffers;
|
using System.Buffers;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|
@ -177,7 +178,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Performance
|
||||||
|
|
||||||
var serviceContext = new ServiceContext
|
var serviceContext = new ServiceContext
|
||||||
{
|
{
|
||||||
DateHeaderValueManager = new DateHeaderValueManager(),
|
DateHeaderValueManager = _dateHeaderValueManager,
|
||||||
ServerOptions = new KestrelServerOptions(),
|
ServerOptions = new KestrelServerOptions(),
|
||||||
Log = new MockTrace(),
|
Log = new MockTrace(),
|
||||||
HttpParser = new HttpParser<Http1ParsingHandler>()
|
HttpParser = new HttpParser<Http1ParsingHandler>()
|
||||||
|
|
@ -192,6 +193,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Performance
|
||||||
});
|
});
|
||||||
|
|
||||||
http1Connection.Reset();
|
http1Connection.Reset();
|
||||||
|
serviceContext.DateHeaderValueManager.OnHeartbeat(DateTimeOffset.UtcNow);
|
||||||
|
|
||||||
_responseHeadersDirect = (HttpResponseHeaders)http1Connection.ResponseHeaders;
|
_responseHeadersDirect = (HttpResponseHeaders)http1Connection.ResponseHeaders;
|
||||||
var context = new DefaultHttpContext(http1Connection);
|
var context = new DefaultHttpContext(http1Connection);
|
||||||
|
|
|
||||||
|
|
@ -137,6 +137,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Performance
|
||||||
});
|
});
|
||||||
|
|
||||||
http1Connection.Reset();
|
http1Connection.Reset();
|
||||||
|
serviceContext.DateHeaderValueManager.OnHeartbeat(DateTimeOffset.UtcNow);
|
||||||
|
|
||||||
_http1Connection = http1Connection;
|
_http1Connection = http1Connection;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,20 +18,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
|
||||||
|
|
||||||
private DateHeaderValues _dateValues;
|
private DateHeaderValues _dateValues;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="DateHeaderValueManager"/> class.
|
|
||||||
/// </summary>
|
|
||||||
public DateHeaderValueManager()
|
|
||||||
: this(DateTimeOffset.UtcNow)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Internal for testing
|
|
||||||
internal DateHeaderValueManager(DateTimeOffset initialUtcNow)
|
|
||||||
{
|
|
||||||
SetDateValues(initialUtcNow);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a value representing the current server date/time for use in the HTTP "Date" response header
|
/// Returns a value representing the current server date/time for use in the HTTP "Date" response header
|
||||||
/// in accordance with http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
|
/// in accordance with http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure
|
||||||
|
|
||||||
public void Start()
|
public void Start()
|
||||||
{
|
{
|
||||||
|
OnHeartbeat();
|
||||||
_timer = new Timer(OnHeartbeat, state: this, dueTime: _interval, period: _interval);
|
_timer = new Timer(OnHeartbeat, state: this, dueTime: _interval, period: _interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure
|
||||||
private readonly Action<KestrelConnection> _walkCallback;
|
private readonly Action<KestrelConnection> _walkCallback;
|
||||||
private DateTimeOffset _now;
|
private DateTimeOffset _now;
|
||||||
|
|
||||||
public HeartbeatManager(ConnectionManager connectionManager, DateTimeOffset initialUtcNow)
|
public HeartbeatManager(ConnectionManager connectionManager)
|
||||||
{
|
{
|
||||||
_connectionManager = connectionManager;
|
_connectionManager = connectionManager;
|
||||||
_now = initialUtcNow;
|
|
||||||
_walkCallback = WalkCallback;
|
_walkCallback = WalkCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -71,9 +71,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core
|
||||||
trace,
|
trace,
|
||||||
serverOptions.Limits.MaxConcurrentUpgradedConnections);
|
serverOptions.Limits.MaxConcurrentUpgradedConnections);
|
||||||
|
|
||||||
var now = DateTimeOffset.UtcNow;
|
var heartbeatManager = new HeartbeatManager(connectionManager);
|
||||||
var heartbeatManager = new HeartbeatManager(connectionManager, now);
|
var dateHeaderValueManager = new DateHeaderValueManager();
|
||||||
var dateHeaderValueManager = new DateHeaderValueManager(now);
|
|
||||||
var heartbeat = new Heartbeat(
|
var heartbeat = new Heartbeat(
|
||||||
new IHeartbeatHandler[] { dateHeaderValueManager, heartbeatManager },
|
new IHeartbeatHandler[] { dateHeaderValueManager, heartbeatManager },
|
||||||
new SystemClock(),
|
new SystemClock(),
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
{
|
{
|
||||||
var now = DateTimeOffset.UtcNow;
|
var now = DateTimeOffset.UtcNow;
|
||||||
|
|
||||||
var dateHeaderValueManager = new DateHeaderValueManager(now);
|
var dateHeaderValueManager = new DateHeaderValueManager();
|
||||||
|
dateHeaderValueManager.OnHeartbeat(now);
|
||||||
|
|
||||||
Assert.Equal(now.ToString(Rfc1123DateFormat), dateHeaderValueManager.GetDateHeaderValues().String);
|
Assert.Equal(now.ToString(Rfc1123DateFormat), dateHeaderValueManager.GetDateHeaderValues().String);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -39,7 +41,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
UtcNow = now
|
UtcNow = now
|
||||||
};
|
};
|
||||||
|
|
||||||
var dateHeaderValueManager = new DateHeaderValueManager(now);
|
var dateHeaderValueManager = new DateHeaderValueManager();
|
||||||
|
dateHeaderValueManager.OnHeartbeat(now);
|
||||||
|
|
||||||
var testKestrelTrace = new TestKestrelTrace();
|
var testKestrelTrace = new TestKestrelTrace();
|
||||||
|
|
||||||
using (var heartbeat = new Heartbeat(new IHeartbeatHandler[] { dateHeaderValueManager }, systemClock, DebuggerWrapper.Singleton, testKestrelTrace))
|
using (var heartbeat = new Heartbeat(new IHeartbeatHandler[] { dateHeaderValueManager }, systemClock, DebuggerWrapper.Singleton, testKestrelTrace))
|
||||||
|
|
@ -62,7 +66,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
UtcNow = now
|
UtcNow = now
|
||||||
};
|
};
|
||||||
|
|
||||||
var dateHeaderValueManager = new DateHeaderValueManager(now);
|
var dateHeaderValueManager = new DateHeaderValueManager();
|
||||||
|
dateHeaderValueManager.OnHeartbeat(now);
|
||||||
|
|
||||||
var testKestrelTrace = new TestKestrelTrace();
|
var testKestrelTrace = new TestKestrelTrace();
|
||||||
|
|
||||||
var mockHeartbeatHandler = new Mock<IHeartbeatHandler>();
|
var mockHeartbeatHandler = new Mock<IHeartbeatHandler>();
|
||||||
|
|
@ -93,7 +99,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
UtcNow = now
|
UtcNow = now
|
||||||
};
|
};
|
||||||
|
|
||||||
var dateHeaderValueManager = new DateHeaderValueManager(now);
|
var dateHeaderValueManager = new DateHeaderValueManager();
|
||||||
|
dateHeaderValueManager.OnHeartbeat(now);
|
||||||
|
|
||||||
var testKestrelTrace = new TestKestrelTrace();
|
var testKestrelTrace = new TestKestrelTrace();
|
||||||
|
|
||||||
using (var heatbeat = new Heartbeat(new IHeartbeatHandler[] { dateHeaderValueManager }, systemClock, DebuggerWrapper.Singleton, testKestrelTrace))
|
using (var heatbeat = new Heartbeat(new IHeartbeatHandler[] { dateHeaderValueManager }, systemClock, DebuggerWrapper.Singleton, testKestrelTrace))
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,14 @@ using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting.Server;
|
using Microsoft.AspNetCore.Hosting.Server;
|
||||||
using Microsoft.AspNetCore.Hosting.Server.Features;
|
using Microsoft.AspNetCore.Hosting.Server.Features;
|
||||||
|
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
|
||||||
|
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal;
|
using Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal;
|
||||||
using Microsoft.AspNetCore.Testing;
|
using Microsoft.AspNetCore.Testing;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
using Microsoft.Net.Http.Headers;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
|
|
@ -384,6 +387,42 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
mockTransport.Verify(transport => transport.UnbindAsync(), Times.Once);
|
mockTransport.Verify(transport => transport.UnbindAsync(), Times.Once);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void StartingServerInitializesHeartbeat()
|
||||||
|
{
|
||||||
|
var testContext = new TestServiceContext()
|
||||||
|
{
|
||||||
|
ServerOptions =
|
||||||
|
{
|
||||||
|
ListenOptions =
|
||||||
|
{
|
||||||
|
new ListenOptions(new IPEndPoint(IPAddress.Loopback, 0))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
DateHeaderValueManager = new DateHeaderValueManager()
|
||||||
|
};
|
||||||
|
|
||||||
|
testContext.Heartbeat = new Heartbeat(
|
||||||
|
new IHeartbeatHandler[] { testContext.DateHeaderValueManager },
|
||||||
|
testContext.MockSystemClock,
|
||||||
|
DebuggerWrapper.Singleton,
|
||||||
|
testContext.Log);
|
||||||
|
|
||||||
|
using (var server = new KestrelServer(new MockTransportFactory(), testContext))
|
||||||
|
{
|
||||||
|
Assert.Null(testContext.DateHeaderValueManager.GetDateHeaderValues());
|
||||||
|
|
||||||
|
// Ensure KestrelServer is started at a different time than when it was constructed, since we're
|
||||||
|
// verifying the heartbeat is initialized during KestrelServer.StartAsync().
|
||||||
|
testContext.MockSystemClock.UtcNow += TimeSpan.FromDays(1);
|
||||||
|
|
||||||
|
StartDummyApplication(server);
|
||||||
|
|
||||||
|
Assert.Equal(HeaderUtilities.FormatDate(testContext.MockSystemClock.UtcNow),
|
||||||
|
testContext.DateHeaderValueManager.GetDateHeaderValues().String);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static KestrelServer CreateServer(KestrelServerOptions options, ILogger testLogger)
|
private static KestrelServer CreateServer(KestrelServerOptions options, ILogger testLogger)
|
||||||
{
|
{
|
||||||
return new KestrelServer(Options.Create(options), new MockTransportFactory(), new LoggerFactory(new[] { new KestrelTestLoggerProvider(testLogger) }));
|
return new KestrelServer(Options.Create(options), new MockTransportFactory(), new LoggerFactory(new[] { new KestrelTestLoggerProvider(testLogger) }));
|
||||||
|
|
|
||||||
|
|
@ -312,7 +312,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
LoggerFactory.AddProvider(loggerProvider);
|
LoggerFactory.AddProvider(loggerProvider);
|
||||||
|
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
|
|
||||||
var handshakeStartedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
var handshakeStartedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
TimeSpan handshakeTimeout = default;
|
TimeSpan handshakeTimeout = default;
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
public async Task ConnectionClosedWhenKeepAliveTimeoutExpires()
|
public async Task ConnectionClosedWhenKeepAliveTimeoutExpires()
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
|
|
||||||
using (var server = CreateServer(testContext))
|
using (var server = CreateServer(testContext))
|
||||||
using (var connection = server.CreateConnection())
|
using (var connection = server.CreateConnection())
|
||||||
|
|
@ -51,7 +51,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
public async Task ConnectionKeptAliveBetweenRequests()
|
public async Task ConnectionKeptAliveBetweenRequests()
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
|
|
||||||
using (var server = CreateServer(testContext))
|
using (var server = CreateServer(testContext))
|
||||||
using (var connection = server.CreateConnection())
|
using (var connection = server.CreateConnection())
|
||||||
|
|
@ -76,7 +76,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
public async Task ConnectionNotTimedOutWhileRequestBeingSent()
|
public async Task ConnectionNotTimedOutWhileRequestBeingSent()
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
|
|
||||||
using (var server = CreateServer(testContext))
|
using (var server = CreateServer(testContext))
|
||||||
using (var connection = server.CreateConnection())
|
using (var connection = server.CreateConnection())
|
||||||
|
|
@ -113,7 +113,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
private async Task ConnectionNotTimedOutWhileAppIsRunning()
|
private async Task ConnectionNotTimedOutWhileAppIsRunning()
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
var cts = new CancellationTokenSource();
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
using (var server = CreateServer(testContext, longRunningCt: cts.Token))
|
using (var server = CreateServer(testContext, longRunningCt: cts.Token))
|
||||||
|
|
@ -150,7 +150,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
private async Task ConnectionTimesOutWhenOpenedButNoRequestSent()
|
private async Task ConnectionTimesOutWhenOpenedButNoRequestSent()
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
|
|
||||||
using (var server = CreateServer(testContext))
|
using (var server = CreateServer(testContext))
|
||||||
using (var connection = server.CreateConnection())
|
using (var connection = server.CreateConnection())
|
||||||
|
|
@ -167,7 +167,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
private async Task KeepAliveTimeoutDoesNotApplyToUpgradedConnections()
|
private async Task KeepAliveTimeoutDoesNotApplyToUpgradedConnections()
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
var cts = new CancellationTokenSource();
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
using (var server = CreateServer(testContext, upgradeCt: cts.Token))
|
using (var server = CreateServer(testContext, upgradeCt: cts.Token))
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
{
|
{
|
||||||
var gracePeriod = TimeSpan.FromSeconds(5);
|
var gracePeriod = TimeSpan.FromSeconds(5);
|
||||||
var serviceContext = new TestServiceContext(LoggerFactory);
|
var serviceContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(serviceContext.ConnectionManager, serviceContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(serviceContext.ConnectionManager);
|
||||||
|
|
||||||
var appRunningEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
var appRunningEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
|
|
||||||
|
|
@ -95,7 +95,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
serviceContext.InitializeHeartbeat();
|
serviceContext.InitializeHeartbeat();
|
||||||
|
|
||||||
// Ensure there's still a constant date header value.
|
// Ensure there's still a constant date header value.
|
||||||
serviceContext.DateHeaderValueManager = new DateHeaderValueManager();
|
var clock = new MockSystemClock();
|
||||||
|
var date = new DateHeaderValueManager();
|
||||||
|
date.OnHeartbeat(clock.UtcNow);
|
||||||
|
serviceContext.DateHeaderValueManager = date;
|
||||||
|
|
||||||
var appRunningEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
var appRunningEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
|
|
||||||
|
|
@ -137,7 +140,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
{
|
{
|
||||||
var gracePeriod = TimeSpan.FromSeconds(5);
|
var gracePeriod = TimeSpan.FromSeconds(5);
|
||||||
var serviceContext = new TestServiceContext(LoggerFactory);
|
var serviceContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(serviceContext.ConnectionManager, serviceContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(serviceContext.ConnectionManager);
|
||||||
|
|
||||||
var appRunningTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
var appRunningTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
var exceptionSwallowedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
var exceptionSwallowedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
public async Task ConnectionAbortedWhenRequestHeadersNotReceivedInTime(string headers)
|
public async Task ConnectionAbortedWhenRequestHeadersNotReceivedInTime(string headers)
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
|
|
||||||
using (var server = CreateServer(testContext))
|
using (var server = CreateServer(testContext))
|
||||||
using (var connection = server.CreateConnection())
|
using (var connection = server.CreateConnection())
|
||||||
|
|
@ -47,7 +47,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
public async Task RequestHeadersTimeoutCanceledAfterHeadersReceived()
|
public async Task RequestHeadersTimeoutCanceledAfterHeadersReceived()
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
|
|
||||||
using (var server = CreateServer(testContext))
|
using (var server = CreateServer(testContext))
|
||||||
using (var connection = server.CreateConnection())
|
using (var connection = server.CreateConnection())
|
||||||
|
|
@ -76,7 +76,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
public async Task ConnectionAbortedWhenRequestLineNotReceivedInTime(string requestLine)
|
public async Task ConnectionAbortedWhenRequestLineNotReceivedInTime(string requestLine)
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
|
|
||||||
using (var server = CreateServer(testContext))
|
using (var server = CreateServer(testContext))
|
||||||
using (var connection = server.CreateConnection())
|
using (var connection = server.CreateConnection())
|
||||||
|
|
@ -95,7 +95,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
public async Task TimeoutNotResetOnEachRequestLineCharacterReceived()
|
public async Task TimeoutNotResetOnEachRequestLineCharacterReceived()
|
||||||
{
|
{
|
||||||
var testContext = new TestServiceContext(LoggerFactory);
|
var testContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager);
|
||||||
|
|
||||||
using (var server = CreateServer(testContext))
|
using (var server = CreateServer(testContext))
|
||||||
using (var connection = server.CreateConnection())
|
using (var connection = server.CreateConnection())
|
||||||
|
|
|
||||||
|
|
@ -945,7 +945,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests
|
||||||
var appEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
var appEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
var delayEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
var delayEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
var serviceContext = new TestServiceContext(LoggerFactory);
|
var serviceContext = new TestServiceContext(LoggerFactory);
|
||||||
var heartbeatManager = new HeartbeatManager(serviceContext.ConnectionManager, serviceContext.SystemClock.UtcNow);
|
var heartbeatManager = new HeartbeatManager(serviceContext.ConnectionManager);
|
||||||
|
|
||||||
using (var server = new TestServer(async context =>
|
using (var server = new TestServer(async context =>
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,8 @@ namespace Microsoft.AspNetCore.Testing
|
||||||
|
|
||||||
public void InitializeHeartbeat()
|
public void InitializeHeartbeat()
|
||||||
{
|
{
|
||||||
var now = DateTimeOffset.UtcNow;
|
var heartbeatManager = new HeartbeatManager(ConnectionManager);
|
||||||
var heartbeatManager = new HeartbeatManager(ConnectionManager, now);
|
DateHeaderValueManager = new DateHeaderValueManager();
|
||||||
DateHeaderValueManager = new DateHeaderValueManager(now);
|
|
||||||
Heartbeat = new Heartbeat(
|
Heartbeat = new Heartbeat(
|
||||||
new IHeartbeatHandler[] { DateHeaderValueManager, heartbeatManager },
|
new IHeartbeatHandler[] { DateHeaderValueManager, heartbeatManager },
|
||||||
new SystemClock(),
|
new SystemClock(),
|
||||||
|
|
@ -61,13 +60,15 @@ namespace Microsoft.AspNetCore.Testing
|
||||||
Scheduler = PipeScheduler.ThreadPool;
|
Scheduler = PipeScheduler.ThreadPool;
|
||||||
MockSystemClock = new MockSystemClock();
|
MockSystemClock = new MockSystemClock();
|
||||||
SystemClock = MockSystemClock;
|
SystemClock = MockSystemClock;
|
||||||
DateHeaderValueManager = new DateHeaderValueManager(MockSystemClock.UtcNow);
|
DateHeaderValueManager = new DateHeaderValueManager();
|
||||||
ConnectionManager = new ConnectionManager(Log, ResourceCounter.Unlimited);
|
ConnectionManager = new ConnectionManager(Log, ResourceCounter.Unlimited);
|
||||||
HttpParser = new HttpParser<Http1ParsingHandler>(Log.IsEnabled(LogLevel.Information));
|
HttpParser = new HttpParser<Http1ParsingHandler>(Log.IsEnabled(LogLevel.Information));
|
||||||
ServerOptions = new KestrelServerOptions
|
ServerOptions = new KestrelServerOptions
|
||||||
{
|
{
|
||||||
AddServerHeader = false
|
AddServerHeader = false
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DateHeaderValueManager.OnHeartbeat(SystemClock.UtcNow);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ILoggerFactory LoggerFactory { get; set; }
|
public ILoggerFactory LoggerFactory { get; set; }
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue