Initialize Heartbeat in KestrelServer.StartAsync (#2939)

Fixes #2850 again
This commit is contained in:
Stephen Halter 2018-09-17 16:43:30 -07:00 committed by GitHub
parent a7e412ec80
commit f3b6430aab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 83 additions and 43 deletions

View File

@ -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;
} }

View File

@ -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);

View File

@ -137,6 +137,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Performance
}); });
http1Connection.Reset(); http1Connection.Reset();
serviceContext.DateHeaderValueManager.OnHeartbeat(DateTimeOffset.UtcNow);
_http1Connection = http1Connection; _http1Connection = http1Connection;
} }

View File

@ -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

View File

@ -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);
} }

View File

@ -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;
} }

View File

@ -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(),

View File

@ -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))

View File

@ -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) }));

View File

@ -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;

View File

@ -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))

View File

@ -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);

View File

@ -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())

View File

@ -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 =>
{ {

View File

@ -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; }