Merge branch 'release/2.1' into release/2.1.2

This commit is contained in:
Nate McMaster 2018-06-12 14:16:29 -07:00
commit ff3f0e905d
No known key found for this signature in database
GPG Key ID: A778D9601BD78810
18 changed files with 173 additions and 126 deletions

View File

@ -5,44 +5,44 @@
<!-- This files is typically managed by automation. Execute 'run.ps1 upgrade deps' to update these variables to the last-known-good versions. --> <!-- This files is typically managed by automation. Execute 'run.ps1 upgrade deps' to update these variables to the last-known-good versions. -->
<PropertyGroup Label="Package Versions"> <PropertyGroup Label="Package Versions">
<BenchmarkDotNetPackageVersion>0.10.13</BenchmarkDotNetPackageVersion> <BenchmarkDotNetPackageVersion>0.10.13</BenchmarkDotNetPackageVersion>
<InternalAspNetCoreSdkPackageVersion>2.1.1-rtm-15790</InternalAspNetCoreSdkPackageVersion> <InternalAspNetCoreSdkPackageVersion>2.1.1-rtm-15793</InternalAspNetCoreSdkPackageVersion>
<LibuvPackageVersion>1.10.0</LibuvPackageVersion> <LibuvPackageVersion>1.10.0</LibuvPackageVersion>
<MicrosoftAspNetCoreAllPackageVersion>2.1.0</MicrosoftAspNetCoreAllPackageVersion> <MicrosoftAspNetCoreAllPackageVersion>2.1.1</MicrosoftAspNetCoreAllPackageVersion>
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>2.1.0</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion> <MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>2.1.1</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
<MicrosoftAspNetCoreCertificatesGenerationSourcesPackageVersion>2.1.0</MicrosoftAspNetCoreCertificatesGenerationSourcesPackageVersion> <MicrosoftAspNetCoreCertificatesGenerationSourcesPackageVersion>2.1.1</MicrosoftAspNetCoreCertificatesGenerationSourcesPackageVersion>
<MicrosoftAspNetCoreHostingAbstractionsPackageVersion>2.1.0</MicrosoftAspNetCoreHostingAbstractionsPackageVersion> <MicrosoftAspNetCoreHostingAbstractionsPackageVersion>2.1.1</MicrosoftAspNetCoreHostingAbstractionsPackageVersion>
<MicrosoftAspNetCoreHostingPackageVersion>2.1.0</MicrosoftAspNetCoreHostingPackageVersion> <MicrosoftAspNetCoreHostingPackageVersion>2.1.1</MicrosoftAspNetCoreHostingPackageVersion>
<MicrosoftAspNetCoreHttpAbstractionsPackageVersion>2.1.0</MicrosoftAspNetCoreHttpAbstractionsPackageVersion> <MicrosoftAspNetCoreHttpAbstractionsPackageVersion>2.1.1</MicrosoftAspNetCoreHttpAbstractionsPackageVersion>
<MicrosoftAspNetCoreHttpFeaturesPackageVersion>2.1.0</MicrosoftAspNetCoreHttpFeaturesPackageVersion> <MicrosoftAspNetCoreHttpFeaturesPackageVersion>2.1.1</MicrosoftAspNetCoreHttpFeaturesPackageVersion>
<MicrosoftAspNetCoreHttpPackageVersion>2.1.0</MicrosoftAspNetCoreHttpPackageVersion> <MicrosoftAspNetCoreHttpPackageVersion>2.1.1</MicrosoftAspNetCoreHttpPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>2.1.0</MicrosoftAspNetCoreTestingPackageVersion> <MicrosoftAspNetCoreTestingPackageVersion>2.1.0</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftAspNetCoreWebUtilitiesPackageVersion>2.1.0</MicrosoftAspNetCoreWebUtilitiesPackageVersion> <MicrosoftAspNetCoreWebUtilitiesPackageVersion>2.1.1</MicrosoftAspNetCoreWebUtilitiesPackageVersion>
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>2.1.0</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion> <MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>2.1.1</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
<MicrosoftExtensionsBuffersSourcesPackageVersion>2.1.0</MicrosoftExtensionsBuffersSourcesPackageVersion> <MicrosoftExtensionsBuffersSourcesPackageVersion>2.1.1</MicrosoftExtensionsBuffersSourcesPackageVersion>
<MicrosoftExtensionsBuffersTestingSourcesPackageVersion>2.1.0</MicrosoftExtensionsBuffersTestingSourcesPackageVersion> <MicrosoftExtensionsBuffersTestingSourcesPackageVersion>2.1.1</MicrosoftExtensionsBuffersTestingSourcesPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>2.1.0</MicrosoftExtensionsConfigurationBinderPackageVersion> <MicrosoftExtensionsConfigurationBinderPackageVersion>2.1.1</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>2.1.0</MicrosoftExtensionsConfigurationCommandLinePackageVersion> <MicrosoftExtensionsConfigurationCommandLinePackageVersion>2.1.1</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>2.1.0</MicrosoftExtensionsConfigurationJsonPackageVersion> <MicrosoftExtensionsConfigurationJsonPackageVersion>2.1.1</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>2.1.0</MicrosoftExtensionsDependencyInjectionPackageVersion> <MicrosoftExtensionsDependencyInjectionPackageVersion>2.1.1</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>2.1.0</MicrosoftExtensionsLoggingAbstractionsPackageVersion> <MicrosoftExtensionsLoggingAbstractionsPackageVersion>2.1.1</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>2.1.0</MicrosoftExtensionsLoggingConsolePackageVersion> <MicrosoftExtensionsLoggingConsolePackageVersion>2.1.1</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>2.1.0</MicrosoftExtensionsLoggingPackageVersion> <MicrosoftExtensionsLoggingPackageVersion>2.1.1</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>2.1.0</MicrosoftExtensionsLoggingTestingPackageVersion> <MicrosoftExtensionsLoggingTestingPackageVersion>2.1.1</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>2.1.0</MicrosoftExtensionsOptionsPackageVersion> <MicrosoftExtensionsOptionsPackageVersion>2.1.1</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftNETCoreApp20PackageVersion>2.0.0</MicrosoftNETCoreApp20PackageVersion> <MicrosoftNETCoreApp20PackageVersion>2.0.0</MicrosoftNETCoreApp20PackageVersion>
<MicrosoftNETCoreApp21PackageVersion>2.1.0</MicrosoftNETCoreApp21PackageVersion> <MicrosoftNETCoreApp21PackageVersion>2.1.1</MicrosoftNETCoreApp21PackageVersion>
<MicrosoftNetHttpHeadersPackageVersion>2.1.0</MicrosoftNetHttpHeadersPackageVersion> <MicrosoftNetHttpHeadersPackageVersion>2.1.1</MicrosoftNetHttpHeadersPackageVersion>
<MicrosoftNETTestSdkPackageVersion>15.6.1</MicrosoftNETTestSdkPackageVersion> <MicrosoftNETTestSdkPackageVersion>15.6.1</MicrosoftNETTestSdkPackageVersion>
<MoqPackageVersion>4.7.49</MoqPackageVersion> <MoqPackageVersion>4.7.49</MoqPackageVersion>
<NETStandardLibrary20PackageVersion>2.0.3</NETStandardLibrary20PackageVersion> <NETStandardLibrary20PackageVersion>2.0.3</NETStandardLibrary20PackageVersion>
<NewtonsoftJsonPackageVersion>11.0.2</NewtonsoftJsonPackageVersion> <NewtonsoftJsonPackageVersion>11.0.2</NewtonsoftJsonPackageVersion>
<SystemBuffersPackageVersion>4.5.0</SystemBuffersPackageVersion> <SystemBuffersPackageVersion>4.5.0</SystemBuffersPackageVersion>
<SystemIOPipelinesPackageVersion>4.5.0</SystemIOPipelinesPackageVersion> <SystemIOPipelinesPackageVersion>4.5.0</SystemIOPipelinesPackageVersion>
<SystemMemoryPackageVersion>4.5.0</SystemMemoryPackageVersion> <SystemMemoryPackageVersion>4.5.1</SystemMemoryPackageVersion>
<SystemNumericsVectorsPackageVersion>4.5.0</SystemNumericsVectorsPackageVersion> <SystemNumericsVectorsPackageVersion>4.5.0</SystemNumericsVectorsPackageVersion>
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.5.0</SystemRuntimeCompilerServicesUnsafePackageVersion> <SystemRuntimeCompilerServicesUnsafePackageVersion>4.5.1</SystemRuntimeCompilerServicesUnsafePackageVersion>
<SystemSecurityCryptographyCngPackageVersion>4.5.0</SystemSecurityCryptographyCngPackageVersion> <SystemSecurityCryptographyCngPackageVersion>4.5.0</SystemSecurityCryptographyCngPackageVersion>
<SystemThreadingTasksExtensionsPackageVersion>4.5.0</SystemThreadingTasksExtensionsPackageVersion> <SystemThreadingTasksExtensionsPackageVersion>4.5.1</SystemThreadingTasksExtensionsPackageVersion>
<Utf8JsonPackageVersion>1.3.7</Utf8JsonPackageVersion> <Utf8JsonPackageVersion>1.3.7</Utf8JsonPackageVersion>
<XunitAnalyzersPackageVersion>0.8.0</XunitAnalyzersPackageVersion> <XunitAnalyzersPackageVersion>0.8.0</XunitAnalyzersPackageVersion>
<XunitPackageVersion>2.3.1</XunitPackageVersion> <XunitPackageVersion>2.3.1</XunitPackageVersion>

View File

@ -1,2 +1,2 @@
version:2.1.1-rtm-15790 version:2.1.1-rtm-15793
commithash:274c65868e735f29f4078c1884c61c4371ee1fc0 commithash:988313f4b064d6c69fc6f7b845b6384a6af3447a

View File

@ -145,6 +145,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return _requestStream.ReadAsync(buffer, offset, count, cancellationToken); return _requestStream.ReadAsync(buffer, offset, count, cancellationToken);
} }
#if NETCOREAPP2_1
public override ValueTask<int> ReadAsync(Memory<byte> destination, CancellationToken cancellationToken = default)
{
return _requestStream.ReadAsync(destination, cancellationToken);
}
#endif
public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken) public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken)
{ {
return _requestStream.CopyToAsync(destination, bufferSize, cancellationToken); return _requestStream.CopyToAsync(destination, bufferSize, cancellationToken);
@ -155,6 +162,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return _responseStream.WriteAsync(buffer, offset, count, cancellationToken); return _responseStream.WriteAsync(buffer, offset, count, cancellationToken);
} }
#if NETCOREAPP2_1
public override ValueTask WriteAsync(ReadOnlyMemory<byte> source, CancellationToken cancellationToken = default)
{
return _responseStream.WriteAsync(source, cancellationToken);
}
#endif
public override long Seek(long offset, SeekOrigin origin) public override long Seek(long offset, SeekOrigin origin)
{ {
return _requestStream.Seek(offset, origin); return _requestStream.Seek(offset, origin);

View File

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net.Security; using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -186,7 +187,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Https.Internal
sslStream.Dispose(); sslStream.Dispose();
return _closedAdaptedConnection; return _closedAdaptedConnection;
} }
catch (IOException ex) catch (Exception ex) when (ex is IOException || ex is AuthenticationException)
{ {
_logger?.LogDebug(1, ex, CoreStrings.AuthenticationFailed); _logger?.LogDebug(1, ex, CoreStrings.AuthenticationFailed);
sslStream.Dispose(); sslStream.Dispose();

View File

@ -68,6 +68,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure
public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
=> _inner.ReadAsync(buffer, offset, count, cancellationToken); => _inner.ReadAsync(buffer, offset, count, cancellationToken);
#if NETCOREAPP2_1
public override ValueTask<int> ReadAsync(Memory<byte> destination, CancellationToken cancellationToken = default)
=> _inner.ReadAsync(destination, cancellationToken);
#endif
public override int ReadByte() public override int ReadByte()
=> _inner.ReadByte(); => _inner.ReadByte();
@ -83,6 +88,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure
public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
=> _inner.WriteAsync(buffer, offset, count, cancellationToken); => _inner.WriteAsync(buffer, offset, count, cancellationToken);
#if NETCOREAPP2_1
public override ValueTask WriteAsync(ReadOnlyMemory<byte> source, CancellationToken cancellationToken = default)
=> _inner.WriteAsync(source, cancellationToken);
#endif
public override void WriteByte(byte value) public override void WriteByte(byte value)
=> _inner.WriteByte(value); => _inner.WriteByte(value);

View File

@ -20,6 +20,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
internal sealed class SocketConnection : TransportConnection internal sealed class SocketConnection : TransportConnection
{ {
private static readonly int MinAllocBufferSize = KestrelMemoryPool.MinimumSegmentSize / 2; private static readonly int MinAllocBufferSize = KestrelMemoryPool.MinimumSegmentSize / 2;
private static readonly bool IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
private readonly Socket _socket; private readonly Socket _socket;
private readonly PipeScheduler _scheduler; private readonly PipeScheduler _scheduler;
@ -54,8 +55,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
ConnectionClosed = _connectionClosedTokenSource.Token; ConnectionClosed = _connectionClosedTokenSource.Token;
_receiver = new SocketReceiver(_socket, _scheduler); // On *nix platforms, Sockets already dispatches to the ThreadPool.
_sender = new SocketSender(_socket, _scheduler); // Yes, the IOQueues are still used for the PipeSchedulers. This is intentional.
// https://github.com/aspnet/KestrelHttpServer/issues/2573
var awaiterScheduler = IsWindows ? _scheduler : PipeScheduler.Inline;
_receiver = new SocketReceiver(_socket, awaiterScheduler);
_sender = new SocketSender(_socket, awaiterScheduler);
} }
public override MemoryPool<byte> MemoryPool { get; } public override MemoryPool<byte> MemoryPool { get; }

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
= new ResourceManager("Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketsStrings", typeof(SocketsStrings).GetTypeInfo().Assembly); = new ResourceManager("Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketsStrings", typeof(SocketsStrings).GetTypeInfo().Assembly);
/// <summary> /// <summary>
/// Only ListenType.IPEndPoint is supported. /// Only ListenType.IPEndPoint is supported by the Socket Transport. https://go.microsoft.com/fwlink/?linkid=874850
/// </summary> /// </summary>
internal static string OnlyIPEndPointsSupported internal static string OnlyIPEndPointsSupported
{ {
@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
} }
/// <summary> /// <summary>
/// Only ListenType.IPEndPoint is supported. /// Only ListenType.IPEndPoint is supported by the Socket Transport. https://go.microsoft.com/fwlink/?linkid=874850
/// </summary> /// </summary>
internal static string FormatOnlyIPEndPointsSupported() internal static string FormatOnlyIPEndPointsSupported()
=> GetString("OnlyIPEndPointsSupported"); => GetString("OnlyIPEndPointsSupported");

View File

@ -118,7 +118,7 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="OnlyIPEndPointsSupported" xml:space="preserve"> <data name="OnlyIPEndPointsSupported" xml:space="preserve">
<value>Only ListenType.IPEndPoint is supported.</value> <value>Only ListenType.IPEndPoint is supported by the Socket Transport. https://go.microsoft.com/fwlink/?linkid=874850</value>
</data> </data>
<data name="TransportAlreadyBound" xml:space="preserve"> <data name="TransportAlreadyBound" xml:space="preserve">
<value>Transport is already bound.</value> <value>Transport is already bound.</value>

View File

@ -22,9 +22,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact] [Fact]
public async Task ResetsCountWhenConnectionClosed() public async Task ResetsCountWhenConnectionClosed()
{ {
var requestTcs = new TaskCompletionSource<object>(); var requestTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var releasedTcs = new TaskCompletionSource<object>(); var releasedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var lockedTcs = new TaskCompletionSource<bool>(); var lockedTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
var counter = new EventRaisingResourceCounter(ResourceCounter.Quota(1)); var counter = new EventRaisingResourceCounter(ResourceCounter.Quota(1));
counter.OnLock += (s, e) => lockedTcs.TrySetResult(e); counter.OnLock += (s, e) => lockedTcs.TrySetResult(e);
counter.OnRelease += (s, e) => releasedTcs.TrySetResult(null); counter.OnRelease += (s, e) => releasedTcs.TrySetResult(null);
@ -95,7 +95,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
public async Task RejectsConnectionsWhenLimitReached() public async Task RejectsConnectionsWhenLimitReached()
{ {
const int max = 10; const int max = 10;
var requestTcs = new TaskCompletionSource<object>(); var requestTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = CreateServerWithMaxConnections(async context => using (var server = CreateServerWithMaxConnections(async context =>
{ {
@ -140,8 +140,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
const int count = 100; const int count = 100;
var opened = 0; var opened = 0;
var closed = 0; var closed = 0;
var openedTcs = new TaskCompletionSource<object>(); var openedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var closedTcs = new TaskCompletionSource<object>(); var closedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var counter = new EventRaisingResourceCounter(ResourceCounter.Quota(uint.MaxValue)); var counter = new EventRaisingResourceCounter(ResourceCounter.Quota(uint.MaxValue));

View File

@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
using (var server = new TestServer(context => using (var server = new TestServer(context =>
{ {
appStartedWh.Release(); appStartedWh.Release();
var tcs = new TaskCompletionSource<object>(); var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
return tcs.Task; return tcs.Task;
}, },
new TestServiceContext(new LoggerFactory(), mockTrace.Object))) new TestServiceContext(new LoggerFactory(), mockTrace.Object)))

View File

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Net; using System.Net;
using System.Net.Security; using System.Net.Security;
using System.Net.Sockets; using System.Net.Sockets;
@ -235,15 +236,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var request = Encoding.ASCII.GetBytes("GET / HTTP/1.1\r\nHost:\r\n\r\n"); var request = Encoding.ASCII.GetBytes("GET / HTTP/1.1\r\nHost:\r\n\r\n");
await sslStream.WriteAsync(request, 0, request.Length); await sslStream.WriteAsync(request, 0, request.Length);
// Temporary workaround for a deadlock when reading from an aborted client SslStream on Mac and Linux. await sslStream.ReadAsync(new byte[32], 0, 32);
if (TestPlatformHelper.IsWindows)
{
await sslStream.ReadAsync(new byte[32], 0, 32);
}
else
{
await stream.ReadAsync(new byte[32], 0, 32);
}
} }
} }
@ -253,7 +246,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact] [Fact]
public async Task DoesNotThrowObjectDisposedExceptionFromWriteAsyncAfterConnectionIsAborted() public async Task DoesNotThrowObjectDisposedExceptionFromWriteAsyncAfterConnectionIsAborted()
{ {
var tcs = new TaskCompletionSource<object>(); var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var loggerProvider = new HandshakeErrorLoggerProvider(); var loggerProvider = new HandshakeErrorLoggerProvider();
LoggerFactory.AddProvider(loggerProvider); LoggerFactory.AddProvider(loggerProvider);
var hostBuilder = TransportSelector.GetWebHostBuilder() var hostBuilder = TransportSelector.GetWebHostBuilder()
@ -295,15 +288,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var request = Encoding.ASCII.GetBytes("GET / HTTP/1.1\r\nHost:\r\n\r\n"); var request = Encoding.ASCII.GetBytes("GET / HTTP/1.1\r\nHost:\r\n\r\n");
await sslStream.WriteAsync(request, 0, request.Length); await sslStream.WriteAsync(request, 0, request.Length);
// Temporary workaround for a deadlock when reading from an aborted client SslStream on Mac and Linux. await sslStream.ReadAsync(new byte[32], 0, 32);
if (TestPlatformHelper.IsWindows)
{
await sslStream.ReadAsync(new byte[32], 0, 32);
}
else
{
await stream.ReadAsync(new byte[32], 0, 32);
}
} }
} }
@ -415,6 +400,43 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
Assert.Equal(LogLevel.Debug, loggerProvider.FilterLogger.LastLogLevel); Assert.Equal(LogLevel.Debug, loggerProvider.FilterLogger.LastLogLevel);
} }
[Fact]
public async Task ClientAttemptingToUseUnsupportedProtocolIsLoggedAsDebug()
{
var loggerProvider = new HandshakeErrorLoggerProvider();
LoggerFactory.AddProvider(loggerProvider);
var hostBuilder = TransportSelector.GetWebHostBuilder()
.UseKestrel(options =>
{
options.Listen(new IPEndPoint(IPAddress.Loopback, 0), listenOptions =>
{
listenOptions.UseHttps(TestResources.TestCertificatePath, "testPassword");
});
})
.ConfigureServices(AddTestLogging)
.Configure(app => app.Run(httpContext => Task.CompletedTask));
using (var host = hostBuilder.Build())
{
host.Start();
using (var socket = await HttpClientSlim.GetSocket(new Uri($"https://127.0.0.1:{host.GetPort()}/")))
using (var stream = new NetworkStream(socket, ownsSocket: false))
using (var sslStream = new SslStream(stream, true, (sender, certificate, chain, errors) => true))
{
// SslProtocols.Tls is TLS 1.0 which isn't supported by Kestrel by default.
await Assert.ThrowsAsync<IOException>(() =>
sslStream.AuthenticateAsClientAsync("127.0.0.1", clientCertificates: null,
enabledSslProtocols: SslProtocols.Tls,
checkCertificateRevocation: false));
}
}
await loggerProvider.FilterLogger.LogTcs.Task.TimeoutAfter(TestConstants.DefaultTimeout);
Assert.Equal(1, loggerProvider.FilterLogger.LastEventId);
Assert.Equal(LogLevel.Debug, loggerProvider.FilterLogger.LastLogLevel);
}
private class HandshakeErrorLoggerProvider : ILoggerProvider private class HandshakeErrorLoggerProvider : ILoggerProvider
{ {
public HttpsConnectionFilterLogger FilterLogger { get; } = new HttpsConnectionFilterLogger(); public HttpsConnectionFilterLogger FilterLogger { get; } = new HttpsConnectionFilterLogger();
@ -441,13 +463,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
{ {
public LogLevel LastLogLevel { get; set; } public LogLevel LastLogLevel { get; set; }
public EventId LastEventId { get; set; } public EventId LastEventId { get; set; }
public TaskCompletionSource<object> LogTcs { get; } = new TaskCompletionSource<object>(); public TaskCompletionSource<object> LogTcs { get; } = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{ {
LastLogLevel = logLevel; LastLogLevel = logLevel;
LastEventId = eventId; LastEventId = eventId;
Task.Run(() => LogTcs.SetResult(null)); LogTcs.SetResult(null);
} }
public bool IsEnabled(LogLevel logLevel) public bool IsEnabled(LogLevel logLevel)

View File

@ -89,8 +89,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
// Initialize data with random bytes // Initialize data with random bytes
(new Random()).NextBytes(data); (new Random()).NextBytes(data);
var startReadingRequestBody = new TaskCompletionSource<object>(); var startReadingRequestBody = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var clientFinishedSendingRequestBody = new TaskCompletionSource<object>(); var clientFinishedSendingRequestBody = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var lastBytesWritten = DateTime.MaxValue; var lastBytesWritten = DateTime.MaxValue;
using (var host = StartWebHost(maxRequestBufferSize, data, connectionAdapter, startReadingRequestBody, clientFinishedSendingRequestBody)) using (var host = StartWebHost(maxRequestBufferSize, data, connectionAdapter, startReadingRequestBody, clientFinishedSendingRequestBody))
@ -181,8 +181,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var bytesWrittenPollingInterval = TimeSpan.FromMilliseconds(bytesWrittenTimeout.TotalMilliseconds / 10); var bytesWrittenPollingInterval = TimeSpan.FromMilliseconds(bytesWrittenTimeout.TotalMilliseconds / 10);
var maxSendSize = 4096; var maxSendSize = 4096;
var startReadingRequestBody = new TaskCompletionSource<object>(); var startReadingRequestBody = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var clientFinishedSendingRequestBody = new TaskCompletionSource<object>(); var clientFinishedSendingRequestBody = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var lastBytesWritten = DateTime.MaxValue; var lastBytesWritten = DateTime.MaxValue;
using (var host = StartWebHost(16 * 1024, data, false, startReadingRequestBody, clientFinishedSendingRequestBody)) using (var host = StartWebHost(16 * 1024, data, false, startReadingRequestBody, clientFinishedSendingRequestBody))

View File

@ -578,8 +578,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
public async Task ConnectionClosedTokenFiresOnClientFIN(ListenOptions listenOptions) public async Task ConnectionClosedTokenFiresOnClientFIN(ListenOptions listenOptions)
{ {
var testContext = new TestServiceContext(LoggerFactory); var testContext = new TestServiceContext(LoggerFactory);
var appStartedTcs = new TaskCompletionSource<object>(); var appStartedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var connectionClosedTcs = new TaskCompletionSource<object>(); var connectionClosedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(context => using (var server = new TestServer(context =>
{ {
@ -613,7 +613,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
public async Task ConnectionClosedTokenFiresOnServerFIN(ListenOptions listenOptions) public async Task ConnectionClosedTokenFiresOnServerFIN(ListenOptions listenOptions)
{ {
var testContext = new TestServiceContext(LoggerFactory); var testContext = new TestServiceContext(LoggerFactory);
var connectionClosedTcs = new TaskCompletionSource<object>(); var connectionClosedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(context => using (var server = new TestServer(context =>
{ {
@ -649,7 +649,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
public async Task ConnectionClosedTokenFiresOnServerAbort(ListenOptions listenOptions) public async Task ConnectionClosedTokenFiresOnServerAbort(ListenOptions listenOptions)
{ {
var testContext = new TestServiceContext(LoggerFactory); var testContext = new TestServiceContext(LoggerFactory);
var connectionClosedTcs = new TaskCompletionSource<object>(); var connectionClosedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(context => using (var server = new TestServer(context =>
{ {
@ -694,9 +694,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[InlineData("http://localhost/path%20with%20space?q=abc%20123", "/path with space", "abc 123")] [InlineData("http://localhost/path%20with%20space?q=abc%20123", "/path with space", "abc 123")]
public async Task CanHandleRequestsWithUrlInAbsoluteForm(string requestUrl, string expectedPath, string queryValue) public async Task CanHandleRequestsWithUrlInAbsoluteForm(string requestUrl, string expectedPath, string queryValue)
{ {
var pathTcs = new TaskCompletionSource<PathString>(); var pathTcs = new TaskCompletionSource<PathString>(TaskCreationOptions.RunContinuationsAsynchronously);
var rawTargetTcs = new TaskCompletionSource<string>(); var rawTargetTcs = new TaskCompletionSource<string>(TaskCreationOptions.RunContinuationsAsynchronously);
var queryTcs = new TaskCompletionSource<IQueryCollection>(); var queryTcs = new TaskCompletionSource<IQueryCollection>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(async context => using (var server = new TestServer(async context =>
{ {
@ -1135,8 +1135,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
{ {
var testContext = new TestServiceContext(LoggerFactory); var testContext = new TestServiceContext(LoggerFactory);
var readTcs = new TaskCompletionSource<object>(); var readTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var registrationTcs = new TaskCompletionSource<int>(); var registrationTcs = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
var requestId = 0; var requestId = 0;
using (var server = new TestServer(async httpContext => using (var server = new TestServer(async httpContext =>
@ -1217,10 +1217,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
const int connectionFinSentEventId = 7; const int connectionFinSentEventId = 7;
const int maxRequestBufferSize = 4096; const int maxRequestBufferSize = 4096;
var readCallbackUnwired = new TaskCompletionSource<object>(TaskContinuationOptions.RunContinuationsAsynchronously); var readCallbackUnwired = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var clientClosedConnection = new TaskCompletionSource<object>(TaskContinuationOptions.RunContinuationsAsynchronously); var clientClosedConnection = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var serverClosedConnection = new TaskCompletionSource<object>(TaskContinuationOptions.RunContinuationsAsynchronously); var serverClosedConnection = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var appFuncCompleted = new TaskCompletionSource<object>(TaskContinuationOptions.RunContinuationsAsynchronously); var appFuncCompleted = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockLogger = new Mock<ILogger>(); var mockLogger = new Mock<ILogger>();
mockLogger mockLogger
@ -1266,7 +1266,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
} }
}; };
var scratchBuffer = new byte[maxRequestBufferSize * 2 + 1]; var scratchBuffer = new byte[maxRequestBufferSize * 8];
using (var server = new TestServer(async context => using (var server = new TestServer(async context =>
{ {
@ -1276,9 +1276,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
await serverClosedConnection.Task; await serverClosedConnection.Task;
// TaskContinuationOptions.RunContinuationsAsynchronously sometimes runs inline anyway in appFuncCompleted.SetResult(null);
// situations such as this where the awaiter starts awaiting right when SetResult is called.
_ = Task.Run(() => appFuncCompleted.SetResult(null));
}, testContext, listenOptions)) }, testContext, listenOptions))
{ {
using (var connection = server.CreateConnection()) using (var connection = server.CreateConnection())
@ -1308,7 +1306,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[MemberData(nameof(ConnectionAdapterData))] [MemberData(nameof(ConnectionAdapterData))]
public async Task AppCanHandleClientAbortingConnectionMidRequest(ListenOptions listenOptions) public async Task AppCanHandleClientAbortingConnectionMidRequest(ListenOptions listenOptions)
{ {
var readTcs = new TaskCompletionSource<Exception>(TaskContinuationOptions.RunContinuationsAsynchronously); var readTcs = new TaskCompletionSource<Exception>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockKestrelTrace = new Mock<KestrelTrace>(Logger) { CallBase = true }; var mockKestrelTrace = new Mock<KestrelTrace>(Logger) { CallBase = true };
var testContext = new TestServiceContext() var testContext = new TestServiceContext()

View File

@ -145,7 +145,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
public async Task OnCompleteCalledEvenWhenOnStartingNotCalled() public async Task OnCompleteCalledEvenWhenOnStartingNotCalled()
{ {
var onStartingCalled = false; var onStartingCalled = false;
var onCompletedTcs = new TaskCompletionSource<object>(); var onCompletedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var hostBuilder = TransportSelector.GetWebHostBuilder() var hostBuilder = TransportSelector.GetWebHostBuilder()
.UseKestrel() .UseKestrel()
@ -341,7 +341,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact] [Fact]
public async Task OnCompletedShouldNotBlockAResponse() public async Task OnCompletedShouldNotBlockAResponse()
{ {
var delayTcs = new TaskCompletionSource<object>(); var delayTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var hostBuilder = TransportSelector.GetWebHostBuilder() var hostBuilder = TransportSelector.GetWebHostBuilder()
.UseKestrel() .UseKestrel()
.UseUrls("http://127.0.0.1:0/") .UseUrls("http://127.0.0.1:0/")
@ -375,7 +375,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact] [Fact]
public async Task InvalidChunkedEncodingInRequestShouldNotBlockOnCompleted() public async Task InvalidChunkedEncodingInRequestShouldNotBlockOnCompleted()
{ {
var onCompletedTcs = new TaskCompletionSource<object>(); var onCompletedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(httpContext => using (var server = new TestServer(httpContext =>
{ {
@ -418,7 +418,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
mockHttpContextFactory.Setup(f => f.Create(It.IsAny<IFeatureCollection>())) mockHttpContextFactory.Setup(f => f.Create(It.IsAny<IFeatureCollection>()))
.Returns<IFeatureCollection>(fc => new DefaultHttpContext(fc)); .Returns<IFeatureCollection>(fc => new DefaultHttpContext(fc));
var disposedTcs = new TaskCompletionSource<int>(); var disposedTcs = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
mockHttpContextFactory.Setup(f => f.Dispose(It.IsAny<HttpContext>())) mockHttpContextFactory.Setup(f => f.Dispose(It.IsAny<HttpContext>()))
.Callback<HttpContext>(c => .Callback<HttpContext>(c =>
{ {
@ -619,7 +619,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
{ {
const string response = "hello, world"; const string response = "hello, world";
var logTcs = new TaskCompletionSource<object>(); var logTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockKestrelTrace = new Mock<IKestrelTrace>(); var mockKestrelTrace = new Mock<IKestrelTrace>();
mockKestrelTrace mockKestrelTrace
.Setup(trace => trace.ConnectionHeadResponseBodyWrite(It.IsAny<string>(), response.Length)) .Setup(trace => trace.ConnectionHeadResponseBodyWrite(It.IsAny<string>(), response.Length))
@ -808,7 +808,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact] [Fact]
public async Task WhenAppWritesLessThanContentLengthErrorLogged() public async Task WhenAppWritesLessThanContentLengthErrorLogged()
{ {
var logTcs = new TaskCompletionSource<object>(); var logTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockTrace = new Mock<IKestrelTrace>(); var mockTrace = new Mock<IKestrelTrace>();
mockTrace mockTrace
.Setup(trace => trace.ApplicationError(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<InvalidOperationException>())) .Setup(trace => trace.ApplicationError(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<InvalidOperationException>()))
@ -1182,7 +1182,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
{ {
var connectionClosed = new ManualResetEventSlim(); var connectionClosed = new ManualResetEventSlim();
var requestStarted = new ManualResetEventSlim(); var requestStarted = new ManualResetEventSlim();
var tcs = new TaskCompletionSource<object>(); var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(async httpContext => using (var server = new TestServer(async httpContext =>
{ {
@ -2279,7 +2279,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
// Ensure string is long enough to disable write-behind buffering // Ensure string is long enough to disable write-behind buffering
var largeString = new string('a', maxBytesPreCompleted + 1); var largeString = new string('a', maxBytesPreCompleted + 1);
var writeTcs = new TaskCompletionSource<object>(); var writeTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var requestAbortedWh = new ManualResetEventSlim(); var requestAbortedWh = new ManualResetEventSlim();
var requestStartWh = new ManualResetEventSlim(); var requestStartWh = new ManualResetEventSlim();
@ -2336,9 +2336,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
const int maxRequestBufferSize = 2048; const int maxRequestBufferSize = 2048;
var requestAborted = false; var requestAborted = false;
var readCallbackUnwired = new TaskCompletionSource<object>(TaskContinuationOptions.RunContinuationsAsynchronously); var readCallbackUnwired = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var clientClosedConnection = new TaskCompletionSource<object>(TaskContinuationOptions.RunContinuationsAsynchronously); var clientClosedConnection = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var writeTcs = new TaskCompletionSource<Exception>(TaskContinuationOptions.RunContinuationsAsynchronously); var writeTcs = new TaskCompletionSource<Exception>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockKestrelTrace = new Mock<KestrelTrace>(Logger) { CallBase = true }; var mockKestrelTrace = new Mock<KestrelTrace>(Logger) { CallBase = true };
var mockLogger = new Mock<ILogger>(); var mockLogger = new Mock<ILogger>();
@ -2401,9 +2401,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
} }
catch (Exception ex) catch (Exception ex)
{ {
// TaskContinuationOptions.RunContinuationsAsynchronously sometimes runs inline anyway in writeTcs.SetException(ex);
// situations such as this where the awaiter starts awaiting right when SetResult is called.
_ = Task.Run(() => writeTcs.SetException(ex));
throw; throw;
} }
@ -2443,7 +2441,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
const int responseBodySize = responseBodySegmentSize * responseBodySegmentCount; const int responseBodySize = responseBodySegmentSize * responseBodySegmentCount;
var requestAborted = false; var requestAborted = false;
var appCompletedTcs = new TaskCompletionSource<object>(TaskContinuationOptions.RunContinuationsAsynchronously); var appCompletedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockKestrelTrace = new Mock<KestrelTrace>(Logger) { CallBase = true }; var mockKestrelTrace = new Mock<KestrelTrace>(Logger) { CallBase = true };
var testContext = new TestServiceContext() var testContext = new TestServiceContext()
@ -2474,9 +2472,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
{ {
// WriteAsync shouldn't throw without a CancellationToken passed in. Unfortunately a ECONNRESET UvException sometimes gets thrown. // WriteAsync shouldn't throw without a CancellationToken passed in. Unfortunately a ECONNRESET UvException sometimes gets thrown.
// This will be fixed by https://github.com/aspnet/KestrelHttpServer/pull/2547 // This will be fixed by https://github.com/aspnet/KestrelHttpServer/pull/2547
// TaskContinuationOptions.RunContinuationsAsynchronously sometimes runs inline anyway in appCompletedTcs.SetResult(null);
// situations such as this where the awaiter starts awaiting right when SetResult is called.
_ = Task.Run(() => appCompletedTcs.SetResult(null));
} }
}, testContext, listenOptions)) }, testContext, listenOptions))
{ {
@ -2623,7 +2619,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var testContext= new TestServiceContext(LoggerFactory); var testContext= new TestServiceContext(LoggerFactory);
var callOrder = new Stack<int>(); var callOrder = new Stack<int>();
var onStartingTcs = new TaskCompletionSource<object>(); var onStartingTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(async context => using (var server = new TestServer(async context =>
{ {
@ -2675,7 +2671,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var testContext= new TestServiceContext(LoggerFactory); var testContext= new TestServiceContext(LoggerFactory);
var callOrder = new Stack<int>(); var callOrder = new Stack<int>();
var onCompletedTcs = new TaskCompletionSource<object>(); var onCompletedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(async context => using (var server = new TestServer(async context =>
{ {
@ -2819,10 +2815,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var responseSize = chunks * chunkSize; var responseSize = chunks * chunkSize;
var chunkData = new byte[chunkSize]; var chunkData = new byte[chunkSize];
var responseRateTimeoutMessageLogged = new TaskCompletionSource<object>(); var responseRateTimeoutMessageLogged = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var connectionStopMessageLogged = new TaskCompletionSource<object>(); var connectionStopMessageLogged = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var requestAborted = new TaskCompletionSource<object>(); var requestAborted = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var appFuncCompleted = new TaskCompletionSource<object>(); var appFuncCompleted = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockKestrelTrace = new Mock<IKestrelTrace>(); var mockKestrelTrace = new Mock<IKestrelTrace>();
mockKestrelTrace mockKestrelTrace
@ -2910,10 +2906,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var certificate = new X509Certificate2(TestResources.TestCertificatePath, "testPassword"); var certificate = new X509Certificate2(TestResources.TestCertificatePath, "testPassword");
var responseRateTimeoutMessageLogged = new TaskCompletionSource<object>(); var responseRateTimeoutMessageLogged = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var connectionStopMessageLogged = new TaskCompletionSource<object>(); var connectionStopMessageLogged = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var aborted = new TaskCompletionSource<object>(); var aborted = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var appFuncCompleted = new TaskCompletionSource<object>(); var appFuncCompleted = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockKestrelTrace = new Mock<IKestrelTrace>(); var mockKestrelTrace = new Mock<IKestrelTrace>();
mockKestrelTrace mockKestrelTrace
@ -3002,10 +2998,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var responseSize = bufferCount * bufferSize; var responseSize = bufferCount * bufferSize;
var buffer = new byte[bufferSize]; var buffer = new byte[bufferSize];
var responseRateTimeoutMessageLogged = new TaskCompletionSource<object>(); var responseRateTimeoutMessageLogged = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var connectionStopMessageLogged = new TaskCompletionSource<object>(); var connectionStopMessageLogged = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var requestAborted = new TaskCompletionSource<object>(); var requestAborted = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var appFuncCompleted = new TaskCompletionSource<object>(); var appFuncCompleted = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockKestrelTrace = new Mock<IKestrelTrace>(); var mockKestrelTrace = new Mock<IKestrelTrace>();
mockKestrelTrace mockKestrelTrace
@ -3089,7 +3085,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var chunkData = new byte[chunkSize]; var chunkData = new byte[chunkSize];
var requestAborted = false; var requestAborted = false;
var appFuncCompleted = new TaskCompletionSource<object>(); var appFuncCompleted = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var mockKestrelTrace = new Mock<IKestrelTrace>(); var mockKestrelTrace = new Mock<IKestrelTrace>();
var testContext = new TestServiceContext var testContext = new TestServiceContext

View File

@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
public static async Task<Socket> ConnectToHost(string hostName, int port) public static async Task<Socket> ConnectToHost(string hostName, int port)
{ {
var tcs = new TaskCompletionSource<Socket>(); var tcs = new TaskCompletionSource<Socket>(TaskCreationOptions.RunContinuationsAsynchronously);
var socketArgs = new SocketAsyncEventArgs(); var socketArgs = new SocketAsyncEventArgs();
socketArgs.RemoteEndPoint = new DnsEndPoint(hostName, port); socketArgs.RemoteEndPoint = new DnsEndPoint(hostName, port);

View File

@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact] [Fact]
public async Task ResponseThrowsAfterUpgrade() public async Task ResponseThrowsAfterUpgrade()
{ {
var upgrade = new TaskCompletionSource<bool>(); var upgrade = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(async context => using (var server = new TestServer(async context =>
{ {
var feature = context.Features.Get<IHttpUpgradeFeature>(); var feature = context.Features.Get<IHttpUpgradeFeature>();
@ -58,7 +58,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
const string send = "Custom protocol send"; const string send = "Custom protocol send";
const string recv = "Custom protocol recv"; const string recv = "Custom protocol recv";
var upgrade = new TaskCompletionSource<bool>(); var upgrade = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(async context => using (var server = new TestServer(async context =>
{ {
try try
@ -109,7 +109,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact] [Fact]
public async Task UpgradeCannotBeCalledMultipleTimes() public async Task UpgradeCannotBeCalledMultipleTimes()
{ {
var upgradeTcs = new TaskCompletionSource<object>(); var upgradeTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(async context => using (var server = new TestServer(async context =>
{ {
var feature = context.Features.Get<IHttpUpgradeFeature>(); var feature = context.Features.Get<IHttpUpgradeFeature>();
@ -217,7 +217,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[Fact] [Fact]
public async Task ThrowsWhenUpgradingNonUpgradableRequest() public async Task ThrowsWhenUpgradingNonUpgradableRequest()
{ {
var upgradeTcs = new TaskCompletionSource<bool>(); var upgradeTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var server = new TestServer(async context => using (var server = new TestServer(async context =>
{ {
var feature = context.Features.Get<IHttpUpgradeFeature>(); var feature = context.Features.Get<IHttpUpgradeFeature>();
@ -251,7 +251,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
public async Task RejectsUpgradeWhenLimitReached() public async Task RejectsUpgradeWhenLimitReached()
{ {
const int limit = 10; const int limit = 10;
var upgradeTcs = new TaskCompletionSource<object>(); var upgradeTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var serviceContext = new TestServiceContext(LoggerFactory); var serviceContext = new TestServiceContext(LoggerFactory);
serviceContext.ConnectionManager = new HttpConnectionManager(serviceContext.Log, ResourceCounter.Quota(limit)); serviceContext.ConnectionManager = new HttpConnectionManager(serviceContext.Log, ResourceCounter.Quota(limit));

View File

@ -140,7 +140,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Tests
Assert.Equal("Primary", await HttpClientSlim.GetStringAsync(address)); Assert.Equal("Primary", await HttpClientSlim.GetStringAsync(address));
// Create a pipe connection and keep it open without sending any data // Create a pipe connection and keep it open without sending any data
var connectTcs = new TaskCompletionSource<object>(); var connectTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var connectionTrace = new LibuvTrace(new TestApplicationErrorLogger()); var connectionTrace = new LibuvTrace(new TestApplicationErrorLogger());
var pipe = new UvPipeHandle(connectionTrace); var pipe = new UvPipeHandle(connectionTrace);

View File

@ -217,7 +217,7 @@ namespace Microsoft.AspNetCore.Testing
public Task WaitForConnectionClose() public Task WaitForConnectionClose()
{ {
var tcs = new TaskCompletionSource<object>(); var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
var eventArgs = new SocketAsyncEventArgs(); var eventArgs = new SocketAsyncEventArgs();
eventArgs.SetBuffer(new byte[128], 0, 128); eventArgs.SetBuffer(new byte[128], 0, 128);
eventArgs.Completed += ReceiveAsyncCompleted; eventArgs.Completed += ReceiveAsyncCompleted;