Migrate to new pipe APIs (#454)
This commit is contained in:
parent
adec0c6fbc
commit
b8c3d26975
|
|
@ -12,4 +12,10 @@
|
||||||
<PublicSign Condition="'$(OS)' != 'Windows_NT'">true</PublicSign>
|
<PublicSign Condition="'$(OS)' != 'Windows_NT'">true</PublicSign>
|
||||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<!-- This is an experimental version of the compiler. See https://github.com/dotnet/csharplang/issues/666 for more details. -->
|
||||||
|
<PackageReference Include="Microsoft.NETCore.Compilers" Version="$(MicrosoftNETCoreCompilersPackageVersion)" PrivateAssets="All" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -26,14 +26,15 @@
|
||||||
<MicrosoftExtensionsOptionsPackageVersion>2.1.0-preview1-27496</MicrosoftExtensionsOptionsPackageVersion>
|
<MicrosoftExtensionsOptionsPackageVersion>2.1.0-preview1-27496</MicrosoftExtensionsOptionsPackageVersion>
|
||||||
<MicrosoftExtensionsSecurityHelperSourcesPackageVersion>2.1.0-preview1-27496</MicrosoftExtensionsSecurityHelperSourcesPackageVersion>
|
<MicrosoftExtensionsSecurityHelperSourcesPackageVersion>2.1.0-preview1-27496</MicrosoftExtensionsSecurityHelperSourcesPackageVersion>
|
||||||
<MicrosoftNETCoreApp20PackageVersion>2.0.0</MicrosoftNETCoreApp20PackageVersion>
|
<MicrosoftNETCoreApp20PackageVersion>2.0.0</MicrosoftNETCoreApp20PackageVersion>
|
||||||
|
<MicrosoftNETCoreCompilersPackageVersion>2.6.0-beta2-62211-02</MicrosoftNETCoreCompilersPackageVersion>
|
||||||
<MicrosoftNETTestSdkPackageVersion>15.3.0</MicrosoftNETTestSdkPackageVersion>
|
<MicrosoftNETTestSdkPackageVersion>15.3.0</MicrosoftNETTestSdkPackageVersion>
|
||||||
<SystemBuffersPackageVersion>4.4.0</SystemBuffersPackageVersion>
|
<SystemBuffersPackageVersion>4.4.0</SystemBuffersPackageVersion>
|
||||||
<SystemIOPipelinesPackageVersion>0.1.0-e170811-6</SystemIOPipelinesPackageVersion>
|
<SystemIOPipelinesPackageVersion>0.1.0-alpha-002</SystemIOPipelinesPackageVersion>
|
||||||
<SystemMemoryPackageVersion>4.4.0-preview3-25519-03</SystemMemoryPackageVersion>
|
<SystemMemoryPackageVersion>4.5.0-preview1-25902-08</SystemMemoryPackageVersion>
|
||||||
<SystemNumericsVectorsPackageVersion>4.4.0</SystemNumericsVectorsPackageVersion>
|
<SystemNumericsVectorsPackageVersion>4.5.0-preview1-25902-08</SystemNumericsVectorsPackageVersion>
|
||||||
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.4.0</SystemRuntimeCompilerServicesUnsafePackageVersion>
|
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.5.0-preview1-25902-08</SystemRuntimeCompilerServicesUnsafePackageVersion>
|
||||||
<SystemSecurityPrincipalWindowsPackageVersion>4.4.0</SystemSecurityPrincipalWindowsPackageVersion>
|
<SystemSecurityPrincipalWindowsPackageVersion>4.4.0</SystemSecurityPrincipalWindowsPackageVersion>
|
||||||
<SystemTextEncodingsWebUtf8PackageVersion>0.1.0-e170811-6</SystemTextEncodingsWebUtf8PackageVersion>
|
<SystemTextEncodingsWebUtf8PackageVersion>0.1.0-alpha-002</SystemTextEncodingsWebUtf8PackageVersion>
|
||||||
<XunitPackageVersion>2.3.0</XunitPackageVersion>
|
<XunitPackageVersion>2.3.0</XunitPackageVersion>
|
||||||
<XunitRunnerVisualStudioPackageVersion>2.3.0</XunitRunnerVisualStudioPackageVersion>
|
<XunitRunnerVisualStudioPackageVersion>2.3.0</XunitRunnerVisualStudioPackageVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
|
||||||
|
|
@ -41,10 +41,10 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
protected Stack<KeyValuePair<Func<object, Task>, object>> _onCompleted;
|
protected Stack<KeyValuePair<Func<object, Task>, object>> _onCompleted;
|
||||||
|
|
||||||
protected Exception _applicationException;
|
protected Exception _applicationException;
|
||||||
private readonly PipeFactory _pipeFactory;
|
private readonly BufferPool _bufferPool;
|
||||||
|
|
||||||
private GCHandle _thisHandle;
|
private GCHandle _thisHandle;
|
||||||
private BufferHandle _inputHandle;
|
private MemoryHandle _inputHandle;
|
||||||
private IISAwaitable _operation = new IISAwaitable();
|
private IISAwaitable _operation = new IISAwaitable();
|
||||||
|
|
||||||
private IISAwaitable _readWebSocketsOperation;
|
private IISAwaitable _readWebSocketsOperation;
|
||||||
|
|
@ -64,12 +64,12 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
private const string NegotiateString = "Negotiate";
|
private const string NegotiateString = "Negotiate";
|
||||||
private const string BasicString = "Basic";
|
private const string BasicString = "Basic";
|
||||||
|
|
||||||
internal unsafe IISHttpContext(PipeFactory pipeFactory, IntPtr pHttpContext, IISOptions options)
|
internal unsafe IISHttpContext(BufferPool bufferPool, IntPtr pHttpContext, IISOptions options)
|
||||||
: base((HttpApiTypes.HTTP_REQUEST*)NativeMethods.http_get_raw_request(pHttpContext))
|
: base((HttpApiTypes.HTTP_REQUEST*)NativeMethods.http_get_raw_request(pHttpContext))
|
||||||
{
|
{
|
||||||
_thisHandle = GCHandle.Alloc(this);
|
_thisHandle = GCHandle.Alloc(this);
|
||||||
|
|
||||||
_pipeFactory = pipeFactory;
|
_bufferPool = bufferPool;
|
||||||
_pHttpContext = pHttpContext;
|
_pHttpContext = pHttpContext;
|
||||||
|
|
||||||
NativeMethods.http_set_managed_context(_pHttpContext, (IntPtr)_thisHandle);
|
NativeMethods.http_set_managed_context(_pHttpContext, (IntPtr)_thisHandle);
|
||||||
|
|
@ -142,8 +142,8 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
RequestBody = new IISHttpRequestBody(this);
|
RequestBody = new IISHttpRequestBody(this);
|
||||||
ResponseBody = new IISHttpResponseBody(this);
|
ResponseBody = new IISHttpResponseBody(this);
|
||||||
|
|
||||||
Input = _pipeFactory.Create(new PipeOptions { ReaderScheduler = TaskRunScheduler.Default });
|
Input = new Pipe(new PipeOptions(_bufferPool, readerScheduler: TaskRunScheduler.Default));
|
||||||
var pipe = _pipeFactory.Create(new PipeOptions { ReaderScheduler = TaskRunScheduler.Default });
|
var pipe = new Pipe(new PipeOptions(_bufferPool, readerScheduler: TaskRunScheduler.Default));
|
||||||
Output = new OutputProducer(pipe);
|
Output = new OutputProducer(pipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -609,7 +609,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
|
|
||||||
// REVIEW: We don't really need this list since the memory is already pinned with the default pool,
|
// REVIEW: We don't really need this list since the memory is already pinned with the default pool,
|
||||||
// but shouldn't assume the pool implementation right now. Unfortunately, this causes a heap allocation...
|
// but shouldn't assume the pool implementation right now. Unfortunately, this causes a heap allocation...
|
||||||
var handles = new BufferHandle[nChunks];
|
var handles = new MemoryHandle[nChunks];
|
||||||
|
|
||||||
foreach (var b in buffer)
|
foreach (var b in buffer)
|
||||||
{
|
{
|
||||||
|
|
@ -620,7 +620,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
|
|
||||||
chunk.DataChunkType = HttpApiTypes.HTTP_DATA_CHUNK_TYPE.HttpDataChunkFromMemory;
|
chunk.DataChunkType = HttpApiTypes.HTTP_DATA_CHUNK_TYPE.HttpDataChunkFromMemory;
|
||||||
chunk.fromMemory.BufferLength = (uint)b.Length;
|
chunk.fromMemory.BufferLength = (uint)b.Length;
|
||||||
chunk.fromMemory.pBuffer = (IntPtr)handle.PinnedPointer;
|
chunk.fromMemory.pBuffer = (IntPtr)handle.Pointer;
|
||||||
|
|
||||||
currentChunk++;
|
currentChunk++;
|
||||||
}
|
}
|
||||||
|
|
@ -661,7 +661,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
{
|
{
|
||||||
var hr = NativeMethods.http_read_request_bytes(
|
var hr = NativeMethods.http_read_request_bytes(
|
||||||
_pHttpContext,
|
_pHttpContext,
|
||||||
(byte*)_inputHandle.PinnedPointer,
|
(byte*)_inputHandle.Pointer,
|
||||||
length,
|
length,
|
||||||
out var dwReceivedBytes,
|
out var dwReceivedBytes,
|
||||||
out bool fCompletionExpected);
|
out bool fCompletionExpected);
|
||||||
|
|
@ -679,7 +679,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
bool fCompletionExpected;
|
bool fCompletionExpected;
|
||||||
hr = NativeMethods.http_websockets_read_bytes(
|
hr = NativeMethods.http_websockets_read_bytes(
|
||||||
_pHttpContext,
|
_pHttpContext,
|
||||||
(byte*)_inputHandle.PinnedPointer,
|
(byte*)_inputHandle.Pointer,
|
||||||
length,
|
length,
|
||||||
IISAwaitable.ReadCallback,
|
IISAwaitable.ReadCallback,
|
||||||
(IntPtr)_thisHandle,
|
(IntPtr)_thisHandle,
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// 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;
|
||||||
|
using System.Buffers;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
|
|
@ -14,8 +15,8 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
{
|
{
|
||||||
private readonly IHttpApplication<TContext> _application;
|
private readonly IHttpApplication<TContext> _application;
|
||||||
|
|
||||||
public IISHttpContextOfT(PipeFactory pipeFactory, IHttpApplication<TContext> application, IntPtr pHttpContext, IISOptions options)
|
public IISHttpContextOfT(BufferPool bufferPool, IHttpApplication<TContext> application, IntPtr pHttpContext, IISOptions options)
|
||||||
: base(pipeFactory, pHttpContext, options)
|
: base(bufferPool, pHttpContext, options)
|
||||||
{
|
{
|
||||||
_application = application;
|
_application = application;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// 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;
|
||||||
|
using System.Buffers;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
@ -22,7 +23,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
private static NativeMethods.PFN_ASYNC_COMPLETION _onAsyncCompletion = OnAsyncCompletion;
|
private static NativeMethods.PFN_ASYNC_COMPLETION _onAsyncCompletion = OnAsyncCompletion;
|
||||||
|
|
||||||
private IISContextFactory _iisContextFactory;
|
private IISContextFactory _iisContextFactory;
|
||||||
private PipeFactory _pipeFactory = new PipeFactory();
|
private readonly BufferPool _bufferPool = new MemoryPool();
|
||||||
private GCHandle _httpServerHandle;
|
private GCHandle _httpServerHandle;
|
||||||
private readonly IApplicationLifetime _applicationLifetime;
|
private readonly IApplicationLifetime _applicationLifetime;
|
||||||
private readonly IAuthenticationSchemeProvider _authentication;
|
private readonly IAuthenticationSchemeProvider _authentication;
|
||||||
|
|
@ -45,7 +46,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
{
|
{
|
||||||
_httpServerHandle = GCHandle.Alloc(this);
|
_httpServerHandle = GCHandle.Alloc(this);
|
||||||
|
|
||||||
_iisContextFactory = new IISContextFactory<TContext>(_pipeFactory, application, _options);
|
_iisContextFactory = new IISContextFactory<TContext>(_bufferPool, application, _options);
|
||||||
|
|
||||||
// Start the server by registering the callback
|
// Start the server by registering the callback
|
||||||
NativeMethods.register_callbacks(_requestHandler, _shutdownHandler, _onAsyncCompletion, (IntPtr)_httpServerHandle, (IntPtr)_httpServerHandle);
|
NativeMethods.register_callbacks(_requestHandler, _shutdownHandler, _onAsyncCompletion, (IntPtr)_httpServerHandle, (IntPtr)_httpServerHandle);
|
||||||
|
|
@ -69,7 +70,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
_httpServerHandle.Free();
|
_httpServerHandle.Free();
|
||||||
}
|
}
|
||||||
|
|
||||||
_pipeFactory.Dispose();
|
_bufferPool.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static NativeMethods.REQUEST_NOTIFICATION_STATUS HandleRequest(IntPtr pHttpContext, IntPtr pvRequestContext)
|
private static NativeMethods.REQUEST_NOTIFICATION_STATUS HandleRequest(IntPtr pHttpContext, IntPtr pvRequestContext)
|
||||||
|
|
@ -125,19 +126,19 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
private class IISContextFactory<T> : IISContextFactory
|
private class IISContextFactory<T> : IISContextFactory
|
||||||
{
|
{
|
||||||
private readonly IHttpApplication<T> _application;
|
private readonly IHttpApplication<T> _application;
|
||||||
private readonly PipeFactory _pipeFactory;
|
private readonly BufferPool _bufferPool;
|
||||||
private readonly IISOptions _options;
|
private readonly IISOptions _options;
|
||||||
|
|
||||||
public IISContextFactory(PipeFactory pipeFactory, IHttpApplication<T> application, IISOptions options)
|
public IISContextFactory(BufferPool bufferPool, IHttpApplication<T> application, IISOptions options)
|
||||||
{
|
{
|
||||||
_application = application;
|
_application = application;
|
||||||
_pipeFactory = pipeFactory;
|
_bufferPool = bufferPool;
|
||||||
_options = options;
|
_options = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IISHttpContext CreateHttpContext(IntPtr pHttpContext)
|
public IISHttpContext CreateHttpContext(IntPtr pHttpContext)
|
||||||
{
|
{
|
||||||
return new IISHttpContextOfT<T>(_pipeFactory, _application, pHttpContext, _options);
|
return new IISHttpContextOfT<T>(_bufferPool, _application, pHttpContext, _options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -107,10 +107,10 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
|
||||||
// The flush task can't fail today
|
// The flush task can't fail today
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
return FlushAsyncAwaited(awaitable, writableBuffer.BytesWritten, cancellationToken);
|
return FlushAsyncAwaited(awaitable, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task FlushAsyncAwaited(WritableBufferAwaitable awaitable, long count, CancellationToken cancellationToken)
|
private async Task FlushAsyncAwaited(WritableBufferAwaitable awaitable, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// https://github.com/dotnet/corefxlab/issues/1334
|
// https://github.com/dotnet/corefxlab/issues/1334
|
||||||
// Since the flush awaitable doesn't currently support multiple awaiters
|
// Since the flush awaitable doesn't currently support multiple awaiters
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue