Merge branch 'release/2.2'

This commit is contained in:
Stephen Halter 2018-08-27 15:49:04 -07:00 committed by GitHub
commit 4d3647d7bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 41 additions and 51 deletions

View File

@ -3,12 +3,6 @@ KestrelHttpServer
[![Join the chat at https://gitter.im/aspnet/KestrelHttpServer](https://badges.gitter.im/aspnet/KestrelHttpServer.svg)](https://gitter.im/aspnet/KestrelHttpServer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Join the chat at https://gitter.im/aspnet/KestrelHttpServer](https://badges.gitter.im/aspnet/KestrelHttpServer.svg)](https://gitter.im/aspnet/KestrelHttpServer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Travis build status][travis-badge]](https://travis-ci.org/aspnet/KestrelHttpServer/branches)
[![AppVeyor build status][appveyor-badge]](https://ci.appveyor.com/project/aspnetci/KestrelHttpServer/branch/dev)
[travis-badge]: https://img.shields.io/travis/aspnet/KestrelHttpServer.svg?label=travis-ci&branch=dev&style=flat-square
[appveyor-badge]: https://img.shields.io/appveyor/ci/aspnetci/KestrelHttpServer/dev.svg?label=appveyor&style=flat-square
This repo contains a cross-platform web server for ASP.NET Core. This repo contains a cross-platform web server for ASP.NET Core.
This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo. This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo.

View File

@ -22,14 +22,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
/// Initializes a new instance of the <see cref="DateHeaderValueManager"/> class. /// Initializes a new instance of the <see cref="DateHeaderValueManager"/> class.
/// </summary> /// </summary>
public DateHeaderValueManager() public DateHeaderValueManager()
: this(systemClock: new SystemClock()) : this(DateTimeOffset.UtcNow)
{ {
} }
// Internal for testing // Internal for testing
internal DateHeaderValueManager(ISystemClock systemClock) internal DateHeaderValueManager(DateTimeOffset initialUtcNow)
{ {
SetDateValues(systemClock.UtcNow); SetDateValues(initialUtcNow);
} }
/// <summary> /// <summary>

View File

@ -19,18 +19,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure
private Timer _timer; private Timer _timer;
private int _executingOnHeartbeat; private int _executingOnHeartbeat;
public Heartbeat(IHeartbeatHandler[] callbacks, ISystemClock systemClock, IDebugger debugger, IKestrelTrace trace): this(callbacks, systemClock, debugger, trace, Interval) public Heartbeat(IHeartbeatHandler[] callbacks, ISystemClock systemClock, IDebugger debugger, IKestrelTrace trace)
{
}
internal Heartbeat(IHeartbeatHandler[] callbacks, ISystemClock systemClock, IDebugger debugger, IKestrelTrace trace, TimeSpan interval)
{ {
_callbacks = callbacks; _callbacks = callbacks;
_systemClock = systemClock; _systemClock = systemClock;
_debugger = debugger; _debugger = debugger;
_trace = trace; _trace = trace;
_interval = interval; _interval = Interval;
} }
public void Start() public void Start()

View File

@ -11,9 +11,10 @@ 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) public HeartbeatManager(ConnectionManager connectionManager, DateTimeOffset initialUtcNow)
{ {
_connectionManager = connectionManager; _connectionManager = connectionManager;
_now = initialUtcNow;
_walkCallback = WalkCallback; _walkCallback = WalkCallback;
} }

View File

@ -71,8 +71,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core
trace, trace,
serverOptions.Limits.MaxConcurrentUpgradedConnections); serverOptions.Limits.MaxConcurrentUpgradedConnections);
var heartbeatManager = new HeartbeatManager(connectionManager); var now = DateTimeOffset.UtcNow;
var dateHeaderValueManager = new DateHeaderValueManager(heartbeatManager); var heartbeatManager = new HeartbeatManager(connectionManager, now);
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

@ -24,12 +24,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
public void GetDateHeaderValue_ReturnsDateValueInRFC1123Format() public void GetDateHeaderValue_ReturnsDateValueInRFC1123Format()
{ {
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
var systemClock = new MockSystemClock
{
UtcNow = now
};
var dateHeaderValueManager = new DateHeaderValueManager(systemClock); var dateHeaderValueManager = new DateHeaderValueManager(now);
Assert.Equal(now.ToString(Rfc1123DateFormat), dateHeaderValueManager.GetDateHeaderValues().String); Assert.Equal(now.ToString(Rfc1123DateFormat), dateHeaderValueManager.GetDateHeaderValues().String);
} }
@ -43,7 +39,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
UtcNow = now UtcNow = now
}; };
var dateHeaderValueManager = new DateHeaderValueManager(systemClock); var dateHeaderValueManager = new DateHeaderValueManager(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))
@ -53,7 +49,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
Assert.Equal(now.ToString(Rfc1123DateFormat), dateHeaderValueManager.GetDateHeaderValues().String); Assert.Equal(now.ToString(Rfc1123DateFormat), dateHeaderValueManager.GetDateHeaderValues().String);
} }
Assert.Equal(1, systemClock.UtcNowCalled); Assert.Equal(0, systemClock.UtcNowCalled);
} }
[Fact] [Fact]
@ -66,7 +62,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
UtcNow = now UtcNow = now
}; };
var dateHeaderValueManager = new DateHeaderValueManager(systemClock); var dateHeaderValueManager = new DateHeaderValueManager(now);
var testKestrelTrace = new TestKestrelTrace(); var testKestrelTrace = new TestKestrelTrace();
var mockHeartbeatHandler = new Mock<IHeartbeatHandler>(); var mockHeartbeatHandler = new Mock<IHeartbeatHandler>();
@ -83,7 +79,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
heartbeat.OnHeartbeat(); heartbeat.OnHeartbeat();
Assert.Equal(future.ToString(Rfc1123DateFormat), dateHeaderValueManager.GetDateHeaderValues().String); Assert.Equal(future.ToString(Rfc1123DateFormat), dateHeaderValueManager.GetDateHeaderValues().String);
Assert.True(systemClock.UtcNowCalled >= 2); Assert.Equal(2, systemClock.UtcNowCalled);
} }
} }
@ -97,7 +93,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
UtcNow = now UtcNow = now
}; };
var dateHeaderValueManager = new DateHeaderValueManager(systemClock); var dateHeaderValueManager = new DateHeaderValueManager(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

@ -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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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

@ -22,7 +22,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); var heartbeatManager = new HeartbeatManager(serviceContext.ConnectionManager, serviceContext.SystemClock.UtcNow);
var appRunningEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously); var appRunningEvent = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
@ -136,7 +136,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); var heartbeatManager = new HeartbeatManager(serviceContext.ConnectionManager, serviceContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
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); var heartbeatManager = new HeartbeatManager(testContext.ConnectionManager, testContext.SystemClock.UtcNow);
using (var server = CreateServer(testContext)) using (var server = CreateServer(testContext))
using (var connection = server.CreateConnection()) using (var connection = server.CreateConnection())

View File

@ -877,7 +877,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); var heartbeatManager = new HeartbeatManager(serviceContext.ConnectionManager, serviceContext.SystemClock.UtcNow);
using (var server = new TestServer(async context => using (var server = new TestServer(async context =>
{ {

View File

@ -100,7 +100,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{ {
socket.Connect(new IPEndPoint(IPAddress.Loopback, host.GetPort())); socket.Connect(new IPEndPoint(IPAddress.Loopback, host.GetPort()));
socket.Send(Encoding.ASCII.GetBytes($"POST / HTTP/1.0\r\nContent-Length: {contentLength}\r\n\r\n")); socket.Send(Encoding.ASCII.GetBytes("POST / HTTP/1.0\r\n"));
Thread.Sleep(5000);
socket.Send(Encoding.ASCII.GetBytes($"Content-Length: {contentLength}\r\n\r\n"));
var contentBytes = new byte[bufferLength]; var contentBytes = new byte[bufferLength];

View File

@ -41,16 +41,17 @@ namespace Microsoft.AspNetCore.Testing
public void InitializeHeartbeat() public void InitializeHeartbeat()
{ {
MockSystemClock = null; var now = DateTimeOffset.UtcNow;
SystemClock = new SystemClock(); var heartbeatManager = new HeartbeatManager(ConnectionManager, now);
DateHeaderValueManager = new DateHeaderValueManager(SystemClock); DateHeaderValueManager = new DateHeaderValueManager(now);
var heartbeatManager = new HeartbeatManager(ConnectionManager);
Heartbeat = new Heartbeat( Heartbeat = new Heartbeat(
new IHeartbeatHandler[] { DateHeaderValueManager, heartbeatManager }, new IHeartbeatHandler[] { DateHeaderValueManager, heartbeatManager },
SystemClock, new SystemClock(),
DebuggerWrapper.Singleton, DebuggerWrapper.Singleton,
Log); Log);
MockSystemClock = null;
SystemClock = heartbeatManager;
} }
private void Initialize(ILoggerFactory loggerFactory, IKestrelTrace kestrelTrace) private void Initialize(ILoggerFactory loggerFactory, IKestrelTrace kestrelTrace)
@ -60,7 +61,7 @@ namespace Microsoft.AspNetCore.Testing
Scheduler = PipeScheduler.ThreadPool; Scheduler = PipeScheduler.ThreadPool;
MockSystemClock = new MockSystemClock(); MockSystemClock = new MockSystemClock();
SystemClock = MockSystemClock; SystemClock = MockSystemClock;
DateHeaderValueManager = new DateHeaderValueManager(MockSystemClock); DateHeaderValueManager = new DateHeaderValueManager(MockSystemClock.UtcNow);
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