From bccd1ea5e8d4dbd4f1367946b22ea60efffd7b50 Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Thu, 16 Jul 2020 21:30:13 +0000 Subject: [PATCH 01/16] Merged PR 9014: [2.1] Cancel SendFile copy loops There are two places in 2.1 where SendFileAsync falls back to a copy loop. These loops should short circuit when the client disconnects, or else the server will sit there and burn resources reading the whole file from disk. Fix: If you passed in your own active CT we'll use it. Otherwise we'll use the RequestAborted token. --- eng/PatchConfig.props | 2 + .../src/SendFileResponseExtensions.cs | 71 ++++++++++++------- ...ft.AspNetCore.Http.Extensions.Tests.csproj | 4 ++ .../test/SendFileResponseExtensionsTests.cs | 42 +++++++++++ src/Http/Http.Extensions/test/testfile1kb.txt | 1 + src/Http/HttpAbstractions.sln | 30 ++++++++ src/Middleware/Middleware.sln | 15 ++++ .../src/BodyWrapperStream.cs | 50 +++++++++++-- .../test/BodyWrapperStreamTests.cs | 18 ++++- 9 files changed, 200 insertions(+), 33 deletions(-) create mode 100644 src/Http/Http.Extensions/test/testfile1kb.txt diff --git a/eng/PatchConfig.props b/eng/PatchConfig.props index 3eb4d105ba43..6f17fb8dec12 100644 --- a/eng/PatchConfig.props +++ b/eng/PatchConfig.props @@ -68,6 +68,8 @@ Later on, this will be checked using this condition: + Microsoft.AspNetCore.Http.Extensions; + Microsoft.AspNetCore.ResponseCompression; diff --git a/src/Http/Http.Extensions/src/SendFileResponseExtensions.cs b/src/Http/Http.Extensions/src/SendFileResponseExtensions.cs index 74c0422ef41f..1ff159c7c9ee 100644 --- a/src/Http/Http.Extensions/src/SendFileResponseExtensions.cs +++ b/src/Http/Http.Extensions/src/SendFileResponseExtensions.cs @@ -107,41 +107,28 @@ public static Task SendFileAsync(this HttpResponse response, string fileName, lo private static async Task SendFileAsyncCore(HttpResponse response, IFileInfo file, long offset, long? count, CancellationToken cancellationToken) { - if (string.IsNullOrEmpty(file.PhysicalPath)) + if (!string.IsNullOrEmpty(file.PhysicalPath)) { - CheckRange(offset, count, file.Length); - - using (var fileContent = file.CreateReadStream()) - { - if (offset > 0) - { - fileContent.Seek(offset, SeekOrigin.Begin); - } - await StreamCopyOperation.CopyToAsync(fileContent, response.Body, count, cancellationToken); - } + await response.SendFileAsync(file.PhysicalPath, offset, count, cancellationToken); + return; } - else + + CheckRange(offset, count, file.Length); + using (var fileContent = file.CreateReadStream()) { - await response.SendFileAsync(file.PhysicalPath, offset, count, cancellationToken); + await SendStreamAsync(fileContent, response, offset, count, cancellationToken); } } - private static Task SendFileAsyncCore(HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken = default) + private static async Task SendFileAsyncCore(HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken = default) { var sendFile = response.HttpContext.Features.Get(); - if (sendFile == null) + if (sendFile != null) { - return SendFileAsyncCore(response.Body, fileName, offset, count, cancellationToken); + await sendFile.SendFileAsync(fileName, offset, count, cancellationToken); + return; } - return sendFile.SendFileAsync(fileName, offset, count, cancellationToken); - } - - // Not safe for overlapped writes. - private static async Task SendFileAsyncCore(Stream outputStream, string fileName, long offset, long? count, CancellationToken cancel = default) - { - cancel.ThrowIfCancellationRequested(); - var fileInfo = new FileInfo(fileName); CheckRange(offset, count, fileInfo.Length); @@ -155,14 +142,44 @@ private static async Task SendFileAsyncCore(Stream outputStream, string fileName options: FileOptions.Asynchronous | FileOptions.SequentialScan); using (fileStream) + { + await SendStreamAsync(fileStream, response, offset, count, cancellationToken); + } + } + + private static Task SendStreamAsync(Stream source, HttpResponse response, long offset, long? count, CancellationToken cancellationToken) + { + if (!cancellationToken.CanBeCanceled) + { + return SendStreamQuietAsync(source, response, offset, count, response.HttpContext.RequestAborted); + } + + cancellationToken.ThrowIfCancellationRequested(); + if (offset > 0) + { + source.Seek(offset, SeekOrigin.Begin); + } + + return StreamCopyOperation.CopyToAsync(source, response.Body, count, cancellationToken); + } + + private static async Task SendStreamQuietAsync(Stream source, HttpResponse response, long offset, long? count, CancellationToken cancellationToken) + { + if (cancellationToken.IsCancellationRequested) + { + return; + } + + try { if (offset > 0) { - fileStream.Seek(offset, SeekOrigin.Begin); + source.Seek(offset, SeekOrigin.Begin); } - await StreamCopyOperation.CopyToAsync(fileStream, outputStream, count, cancel); + await StreamCopyOperation.CopyToAsync(source, response.Body, count, cancellationToken); } + catch (OperationCanceledException) { } } private static void CheckRange(long offset, long? count, long fileLength) @@ -178,4 +195,4 @@ private static void CheckRange(long offset, long? count, long fileLength) } } } -} \ No newline at end of file +} diff --git a/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index aa69c02d8ad2..d13e7555262c 100644 --- a/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -4,6 +4,10 @@ netcoreapp2.1;net461 + + + + diff --git a/src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs b/src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs index f4c7c0f2a991..a763317ceaa2 100644 --- a/src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs +++ b/src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs @@ -1,5 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. See License.txt in the project root for license information. +using System; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -49,5 +50,46 @@ public Task SendFileAsync(string path, long offset, long? length, CancellationTo return Task.FromResult(0); } } + + [Fact] + public async Task SendFile_FallsBackToBodyStream() + { + var body = new MemoryStream(); + var context = new DefaultHttpContext(); + var response = context.Response; + response.Body = body; + + await response.SendFileAsync("testfile1kb.txt", 1, 3, CancellationToken.None); + + Assert.Equal(3, body.Length); + } + + [Fact] + public async Task SendFile_ThrowsWhenCanceled() + { + var body = new MemoryStream(); + var context = new DefaultHttpContext(); + var response = context.Response; + response.Body = body; + + await Assert.ThrowsAsync( + () => response.SendFileAsync("testfile1kb.txt", 1, 3, new CancellationToken(canceled: true))); + + Assert.Equal(0, body.Length); + } + + [Fact] + public async Task SendFile_AbortsSilentlyWhenRequestCanceled() + { + var body = new MemoryStream(); + var context = new DefaultHttpContext(); + context.RequestAborted = new CancellationToken(canceled: true); + var response = context.Response; + response.Body = body; + + await response.SendFileAsync("testfile1kb.txt", 1, 3, CancellationToken.None); + + Assert.Equal(0, body.Length); + } } } diff --git a/src/Http/Http.Extensions/test/testfile1kb.txt b/src/Http/Http.Extensions/test/testfile1kb.txt new file mode 100644 index 000000000000..24baa4c60865 --- /dev/null +++ b/src/Http/Http.Extensions/test/testfile1kb.txt @@ -0,0 +1 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ No newline at end of file diff --git a/src/Http/HttpAbstractions.sln b/src/Http/HttpAbstractions.sln index 17e89b8deae7..6e2a5eabbf0e 100644 --- a/src/Http/HttpAbstractions.sln +++ b/src/Http/HttpAbstractions.sln @@ -81,6 +81,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RoutingSample.Web", "Routin EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dependencies", "dependencies", "{793FFE24-138A-4C3D-81AB-18D625E36230}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel", "..\Servers\Kestrel\Kestrel\src\Microsoft.AspNetCore.Server.Kestrel.csproj", "{C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration", "..\Servers\IIS\IISIntegration\src\Microsoft.AspNetCore.Server.IISIntegration.csproj", "{11E37916-24DF-48A3-AFC9-9E9BB76588E4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -403,6 +407,30 @@ Global {F4F5D8AF-FBD1-463F-9473-B63AA820A6C4}.Release|x64.Build.0 = Release|Any CPU {F4F5D8AF-FBD1-463F-9473-B63AA820A6C4}.Release|x86.ActiveCfg = Release|Any CPU {F4F5D8AF-FBD1-463F-9473-B63AA820A6C4}.Release|x86.Build.0 = Release|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Debug|x64.ActiveCfg = Debug|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Debug|x64.Build.0 = Debug|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Debug|x86.ActiveCfg = Debug|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Debug|x86.Build.0 = Debug|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Release|Any CPU.Build.0 = Release|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Release|x64.ActiveCfg = Release|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Release|x64.Build.0 = Release|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Release|x86.ActiveCfg = Release|Any CPU + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566}.Release|x86.Build.0 = Release|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Debug|x64.ActiveCfg = Debug|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Debug|x64.Build.0 = Debug|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Debug|x86.ActiveCfg = Debug|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Debug|x86.Build.0 = Debug|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Release|Any CPU.Build.0 = Release|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Release|x64.ActiveCfg = Release|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Release|x64.Build.0 = Release|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Release|x86.ActiveCfg = Release|Any CPU + {11E37916-24DF-48A3-AFC9-9E9BB76588E4}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -435,6 +463,8 @@ Global {E4AC79A3-625B-421B-9F91-EFCBD9BEB37F} = {24D19E8E-25FD-4C0B-8865-697878B67BE0} {BF8DC0FF-96F9-4705-8CFA-F42BE989AB6A} = {793FFE24-138A-4C3D-81AB-18D625E36230} {F4F5D8AF-FBD1-463F-9473-B63AA820A6C4} = {14A7B3DE-46C8-4245-B0BD-9AFF3795C163} + {C2608BEB-0C4C-4EDB-A0E4-E29AE59B4566} = {793FFE24-138A-4C3D-81AB-18D625E36230} + {11E37916-24DF-48A3-AFC9-9E9BB76588E4} = {793FFE24-138A-4C3D-81AB-18D625E36230} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {85B5E151-2E9D-419C-83DD-0DDCF446C83A} diff --git a/src/Middleware/Middleware.sln b/src/Middleware/Middleware.sln index e861bd87a8f6..111573a9c9ae 100644 --- a/src/Middleware/Middleware.sln +++ b/src/Middleware/Middleware.sln @@ -191,6 +191,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_dependencies", "_dependencies", "{ACA6DDB9-7592-47CE-A740-D15BF307E9E0}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration", "..\Servers\IIS\IISIntegration\src\Microsoft.AspNetCore.Server.IISIntegration.csproj", "{F05215CF-F754-47BF-ACED-259C53C8B223}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1005,6 +1007,18 @@ Global {260E77CB-800F-4A13-BE92-9CAA097705C2}.Release|x64.Build.0 = Release|Any CPU {260E77CB-800F-4A13-BE92-9CAA097705C2}.Release|x86.ActiveCfg = Release|Any CPU {260E77CB-800F-4A13-BE92-9CAA097705C2}.Release|x86.Build.0 = Release|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Debug|x64.ActiveCfg = Debug|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Debug|x64.Build.0 = Debug|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Debug|x86.ActiveCfg = Debug|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Debug|x86.Build.0 = Debug|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Release|Any CPU.Build.0 = Release|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Release|x64.ActiveCfg = Release|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Release|x64.Build.0 = Release|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Release|x86.ActiveCfg = Release|Any CPU + {F05215CF-F754-47BF-ACED-259C53C8B223}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1086,6 +1100,7 @@ Global {0186A5D0-6D05-4C19-BB81-E49A51745FFF} = {ACA6DDB9-7592-47CE-A740-D15BF307E9E0} {17B7BFF6-4E72-410C-B690-02741505500A} = {ACA6DDB9-7592-47CE-A740-D15BF307E9E0} {260E77CB-800F-4A13-BE92-9CAA097705C2} = {ACA6DDB9-7592-47CE-A740-D15BF307E9E0} + {F05215CF-F754-47BF-ACED-259C53C8B223} = {ACA6DDB9-7592-47CE-A740-D15BF307E9E0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {83786312-A93B-4BB4-AB06-7C6913A59AFA} diff --git a/src/Middleware/ResponseCompression/src/BodyWrapperStream.cs b/src/Middleware/ResponseCompression/src/BodyWrapperStream.cs index d315d82dfad7..ee84b4933820 100644 --- a/src/Middleware/ResponseCompression/src/BodyWrapperStream.cs +++ b/src/Middleware/ResponseCompression/src/BodyWrapperStream.cs @@ -1,4 +1,4 @@ -// 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. using System; @@ -286,10 +286,8 @@ public Task SendFileAsync(string path, long offset, long? count, CancellationTok return _innerSendFileFeature.SendFileAsync(path, offset, count, cancellation); } - private async Task InnerSendFileAsync(string path, long offset, long? count, CancellationToken cancellation) + private Task InnerSendFileAsync(string path, long offset, long? count, CancellationToken cancellation) { - cancellation.ThrowIfCancellationRequested(); - var fileInfo = new FileInfo(path); if (offset < 0 || offset > fileInfo.Length) { @@ -311,9 +309,25 @@ private async Task InnerSendFileAsync(string path, long offset, long? count, Can bufferSize: bufferSize, options: FileOptions.Asynchronous | FileOptions.SequentialScan); + if (cancellation.CanBeCanceled) + { + return InnerSendFileLoudAsync(fileStream, offset, count, cancellation); + } + + return InnerSendFileQuietAsync(fileStream, offset, count, _context.RequestAborted); + } + + private async Task InnerSendFileLoudAsync(Stream fileStream, long offset, long? count, CancellationToken cancellation) + { using (fileStream) { - fileStream.Seek(offset, SeekOrigin.Begin); + cancellation.ThrowIfCancellationRequested(); + + if (offset > 0) + { + fileStream.Seek(offset, SeekOrigin.Begin); + } + await StreamCopyOperation.CopyToAsync(fileStream, _compressionStream, count, cancellation); if (_autoFlush) @@ -322,5 +336,31 @@ private async Task InnerSendFileAsync(string path, long offset, long? count, Can } } } + + private async Task InnerSendFileQuietAsync(Stream fileStream, long offset, long? count, CancellationToken cancellation) + { + try + { + if (!cancellation.IsCancellationRequested) + { + if (offset > 0) + { + fileStream.Seek(offset, SeekOrigin.Begin); + } + + await StreamCopyOperation.CopyToAsync(fileStream, _compressionStream, count, cancellation); + + if (_autoFlush) + { + await _compressionStream.FlushAsync(cancellation); + } + } + } + catch (OperationCanceledException) { } + finally + { + fileStream.Dispose(); + } + } } } diff --git a/src/Middleware/ResponseCompression/test/BodyWrapperStreamTests.cs b/src/Middleware/ResponseCompression/test/BodyWrapperStreamTests.cs index 4ffd70b745e3..15351cd4282e 100644 --- a/src/Middleware/ResponseCompression/test/BodyWrapperStreamTests.cs +++ b/src/Middleware/ResponseCompression/test/BodyWrapperStreamTests.cs @@ -1,4 +1,4 @@ -// 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. using System; @@ -90,6 +90,22 @@ public async Task SendFileAsync_IsPassedToUnderlyingStream_WhenDisableResponseBu Assert.Equal(File.ReadAllBytes(path), memoryStream.ToArray()); } + [Fact] + public async Task SendFileAsync_SkipsSilently_WhenRequestAborted() + { + var memoryStream = new MemoryStream(); + + var context = new DefaultHttpContext(); + context.RequestAborted = new CancellationToken(canceled: true); + var stream = new BodyWrapperStream(context, memoryStream, new MockResponseCompressionProvider(true), null, null); + + var path = "testfile1kb.txt"; + await stream.SendFileAsync(path, 0, null, CancellationToken.None); + stream.Flush(); + + Assert.Equal(0, memoryStream.Length); + } + [Theory] [InlineData(true)] [InlineData(false)] From 07b8318db0ec2d9cf05a8ab2a24847342746a664 Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Thu, 16 Jul 2020 21:37:46 +0000 Subject: [PATCH 02/16] Merged PR 9042: [3.1] Pass RequestAborted to SendFileAsync This is the 3.1 version of https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore/pullrequest/9014. The concerns in 3.1 are slightly different than prior versions due to a significant redesign in how the response body was handled. In 2.1 very few components implemented IHttpSendFileFeature, and most of those that did would eagerly terminate if the request aborted (e.g. HttpSys server). We mainly had to be concerned about the fallback code that did a copy loop when IHttpSendFileFeature wasn't available. In 3.x the response body Stream, PipeWriter, and SendFileAsync were consolidated onto the new IHttpResponseBodyFeature. Now all servers and component shims support all three ways to send data and we can't make any assumptions about how eagerly they terminate. E.g. many components implemented SendFileAsync using a fallback copy loop, and these components don't have access to RequestAborted to eagerly terminate. This means that in 3.1 we need to pass the RequestAborted token when calling IHttpSendFileFeature.SendFileAsync, as well as any copy loops that have access to the token. I've primarily fixed the HttpResponse.SendFileAsync extension methods and made sure the other affected components call through here. [Infrastructure side note] This commit needs to be rebased on internal/release/3.1 before merging. That branch can't be built locally so I developed this fix based on release/3.1 instead. --- .../src/SendFileResponseExtensions.cs | 23 ++++- ...ft.AspNetCore.Http.Extensions.Tests.csproj | 4 + .../test/SendFileResponseExtensionsTests.cs | 95 ++++++++++++++++--- src/Http/Http.Extensions/test/testfile1kb.txt | 1 + .../StaticFiles/src/StaticFileContext.cs | 43 ++------- .../test/UnitTests/StaticFileContextTest.cs | 31 ++++++ 6 files changed, 144 insertions(+), 53 deletions(-) create mode 100644 src/Http/Http.Extensions/test/testfile1kb.txt diff --git a/src/Http/Http.Extensions/src/SendFileResponseExtensions.cs b/src/Http/Http.Extensions/src/SendFileResponseExtensions.cs index e7fd608c0510..8dfae44bdc12 100644 --- a/src/Http/Http.Extensions/src/SendFileResponseExtensions.cs +++ b/src/Http/Http.Extensions/src/SendFileResponseExtensions.cs @@ -16,6 +16,8 @@ namespace Microsoft.AspNetCore.Http /// public static class SendFileResponseExtensions { + private const int StreamCopyBufferSize = 64 * 1024; + /// /// Sends the given file using the SendFile extension. /// @@ -110,15 +112,21 @@ private static async Task SendFileAsyncCore(HttpResponse response, IFileInfo fil if (string.IsNullOrEmpty(file.PhysicalPath)) { CheckRange(offset, count, file.Length); + using var fileContent = file.CreateReadStream(); + + var useRequestAborted = !cancellationToken.CanBeCanceled; + var localCancel = useRequestAborted ? response.HttpContext.RequestAborted : cancellationToken; - using (var fileContent = file.CreateReadStream()) + try { + localCancel.ThrowIfCancellationRequested(); if (offset > 0) { fileContent.Seek(offset, SeekOrigin.Begin); } - await StreamCopyOperation.CopyToAsync(fileContent, response.Body, count, cancellationToken); + await StreamCopyOperation.CopyToAsync(fileContent, response.Body, count, StreamCopyBufferSize, localCancel); } + catch (OperationCanceledException) when (useRequestAborted) { } } else { @@ -126,10 +134,17 @@ private static async Task SendFileAsyncCore(HttpResponse response, IFileInfo fil } } - private static Task SendFileAsyncCore(HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken = default) + private static async Task SendFileAsyncCore(HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken = default) { + var useRequestAborted = !cancellationToken.CanBeCanceled; + var localCancel = useRequestAborted ? response.HttpContext.RequestAborted : cancellationToken; var sendFile = response.HttpContext.Features.Get(); - return sendFile.SendFileAsync(fileName, offset, count, cancellationToken); + + try + { + await sendFile.SendFileAsync(fileName, offset, count, localCancel); + } + catch (OperationCanceledException) when (useRequestAborted) { } } private static void CheckRange(long offset, long? count, long fileLength) diff --git a/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index 19bf5e753ac1..fffeeb054b84 100644 --- a/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -4,6 +4,10 @@ $(DefaultNetCoreTargetFramework) + + + + diff --git a/src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs b/src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs index 134b882b9948..f20675f9beb8 100644 --- a/src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs +++ b/src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs @@ -1,5 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. See License.txt in the project root for license information. +using System; using System.IO; using System.IO.Pipelines; using System.Threading; @@ -28,18 +29,86 @@ public async Task SendFileWorks() await response.SendFileAsync("bob", 1, 3, CancellationToken.None); - Assert.Equal("bob", fakeFeature.name); - Assert.Equal(1, fakeFeature.offset); - Assert.Equal(3, fakeFeature.length); - Assert.Equal(CancellationToken.None, fakeFeature.token); + Assert.Equal("bob", fakeFeature.Name); + Assert.Equal(1, fakeFeature.Offset); + Assert.Equal(3, fakeFeature.Length); + Assert.Equal(CancellationToken.None, fakeFeature.Token); + } + + [Fact] + public async Task SendFile_FallsBackToBodyStream() + { + var body = new MemoryStream(); + var context = new DefaultHttpContext(); + var response = context.Response; + response.Body = body; + + await response.SendFileAsync("testfile1kb.txt", 1, 3, CancellationToken.None); + + Assert.Equal(3, body.Length); + } + + [Fact] + public async Task SendFile_Stream_ThrowsWhenCanceled() + { + var body = new MemoryStream(); + var context = new DefaultHttpContext(); + var response = context.Response; + response.Body = body; + + await Assert.ThrowsAnyAsync( + () => response.SendFileAsync("testfile1kb.txt", 1, 3, new CancellationToken(canceled: true))); + + Assert.Equal(0, body.Length); + } + + [Fact] + public async Task SendFile_Feature_ThrowsWhenCanceled() + { + var context = new DefaultHttpContext(); + var fakeFeature = new FakeResponseBodyFeature(); + context.Features.Set(fakeFeature); + var response = context.Response; + + await Assert.ThrowsAsync( + () => response.SendFileAsync("testfile1kb.txt", 1, 3, new CancellationToken(canceled: true))); + } + + [Fact] + public async Task SendFile_Stream_AbortsSilentlyWhenRequestCanceled() + { + var body = new MemoryStream(); + var context = new DefaultHttpContext(); + context.RequestAborted = new CancellationToken(canceled: true); + var response = context.Response; + response.Body = body; + + await response.SendFileAsync("testfile1kb.txt", 1, 3, CancellationToken.None); + + Assert.Equal(0, body.Length); + } + + [Fact] + public async Task SendFile_Feature_AbortsSilentlyWhenRequestCanceled() + { + var context = new DefaultHttpContext(); + var fakeFeature = new FakeResponseBodyFeature(); + context.Features.Set(fakeFeature); + var token = new CancellationToken(canceled: true); + context.RequestAborted = token; + var response = context.Response; + + await response.SendFileAsync("testfile1kb.txt", 1, 3, CancellationToken.None); + + Assert.Equal(token, fakeFeature.Token); } private class FakeResponseBodyFeature : IHttpResponseBodyFeature { - public string name = null; - public long offset = 0; - public long? length = null; - public CancellationToken token; + public string Name { get; set; } = null; + public long Offset { get; set; } = 0; + public long? Length { get; set; } = null; + public CancellationToken Token { get; set; } public Stream Stream => throw new System.NotImplementedException(); @@ -57,10 +126,12 @@ public void DisableBuffering() public Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) { - this.name = path; - this.offset = offset; - this.length = length; - this.token = cancellation; + Name = path; + Offset = offset; + Length = length; + Token = cancellation; + + cancellation.ThrowIfCancellationRequested(); return Task.FromResult(0); } diff --git a/src/Http/Http.Extensions/test/testfile1kb.txt b/src/Http/Http.Extensions/test/testfile1kb.txt new file mode 100644 index 000000000000..61d982da1a51 --- /dev/null +++ b/src/Http/Http.Extensions/test/testfile1kb.txt @@ -0,0 +1 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/src/Middleware/StaticFiles/src/StaticFileContext.cs b/src/Middleware/StaticFiles/src/StaticFileContext.cs index 3de3576e761f..f3864324bf72 100644 --- a/src/Middleware/StaticFiles/src/StaticFileContext.cs +++ b/src/Middleware/StaticFiles/src/StaticFileContext.cs @@ -5,11 +5,9 @@ using System.Diagnostics; using System.IO; using System.Linq; -using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Headers; using Microsoft.AspNetCore.Internal; @@ -21,8 +19,6 @@ namespace Microsoft.AspNetCore.StaticFiles { internal struct StaticFileContext { - private const int StreamCopyBufferSize = 64 * 1024; - private readonly HttpContext _context; private readonly StaticFileOptions _options; private readonly HttpRequest _request; @@ -345,28 +341,15 @@ public async Task SendAsync() { SetCompressionMode(); ApplyResponseHeaders(Constants.Status200Ok); - string physicalPath = _fileInfo.PhysicalPath; - var sendFile = _context.Features.Get(); - if (sendFile != null && !string.IsNullOrEmpty(physicalPath)) - { - // We don't need to directly cancel this, if the client disconnects it will fail silently. - await sendFile.SendFileAsync(physicalPath, 0, _length, CancellationToken.None); - return; - } - try { - using (var readStream = _fileInfo.CreateReadStream()) - { - // Larger StreamCopyBufferSize is required because in case of FileStream readStream isn't going to be buffering - await StreamCopyOperation.CopyToAsync(readStream, _response.Body, _length, StreamCopyBufferSize, _context.RequestAborted); - } + await _context.Response.SendFileAsync(_fileInfo, 0, _length, _context.RequestAborted); } catch (OperationCanceledException ex) { _logger.WriteCancelled(ex); // Don't throw this exception, it's most likely caused by the client disconnecting. - // However, if it was cancelled for any other reason we need to prevent empty responses. + // However, if it was canceled for any other reason we need to prevent empty responses. _context.Abort(); } } @@ -390,31 +373,17 @@ internal async Task SendRangeAsync() _response.ContentLength = length; SetCompressionMode(); ApplyResponseHeaders(Constants.Status206PartialContent); - - string physicalPath = _fileInfo.PhysicalPath; - var sendFile = _context.Features.Get(); - if (sendFile != null && !string.IsNullOrEmpty(physicalPath)) - { - _logger.SendingFileRange(_response.Headers[HeaderNames.ContentRange], physicalPath); - // We don't need to directly cancel this, if the client disconnects it will fail silently. - await sendFile.SendFileAsync(physicalPath, start, length, CancellationToken.None); - return; - } - try { - using (var readStream = _fileInfo.CreateReadStream()) - { - readStream.Seek(start, SeekOrigin.Begin); // TODO: What if !CanSeek? - _logger.CopyingFileRange(_response.Headers[HeaderNames.ContentRange], SubPath); - await StreamCopyOperation.CopyToAsync(readStream, _response.Body, length, _context.RequestAborted); - } + var logPath = !string.IsNullOrEmpty(_fileInfo.PhysicalPath) ? _fileInfo.PhysicalPath : SubPath; + _logger.SendingFileRange(_response.Headers[HeaderNames.ContentRange], logPath); + await _context.Response.SendFileAsync(_fileInfo, start, length, _context.RequestAborted); } catch (OperationCanceledException ex) { _logger.WriteCancelled(ex); // Don't throw this exception, it's most likely caused by the client disconnecting. - // However, if it was cancelled for any other reason we need to prevent empty responses. + // However, if it was canceled for any other reason we need to prevent empty responses. _context.Abort(); } } diff --git a/src/Middleware/StaticFiles/test/UnitTests/StaticFileContextTest.cs b/src/Middleware/StaticFiles/test/UnitTests/StaticFileContextTest.cs index efea2a08e56d..409cda5b5b4d 100644 --- a/src/Middleware/StaticFiles/test/UnitTests/StaticFileContextTest.cs +++ b/src/Middleware/StaticFiles/test/UnitTests/StaticFileContextTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; @@ -120,6 +121,36 @@ public void SkipsHttpsCompression_IfNotMatched() Assert.Equal(HttpsCompressionMode.Default, httpsCompressionFeature.Mode); } + [Fact] + public async Task RequestAborted_DoesntThrow() + { + var options = new StaticFileOptions(); + var fileProvider = new TestFileProvider(); + fileProvider.AddFile("/foo.txt", new TestFileInfo + { + LastModified = new DateTimeOffset(2014, 1, 2, 3, 4, 5, TimeSpan.Zero) + }); + var pathString = new PathString("/test"); + var httpContext = new DefaultHttpContext(); + httpContext.Request.Path = new PathString("/test/foo.txt"); + httpContext.RequestAborted = new CancellationToken(canceled: true); + var body = new MemoryStream(); + httpContext.Response.Body = body; + var validateResult = StaticFileMiddleware.ValidatePath(httpContext, pathString, out var subPath); + var contentTypeResult = StaticFileMiddleware.LookupContentType(new FileExtensionContentTypeProvider(), options, subPath, out var contentType); + + var context = new StaticFileContext(httpContext, options, NullLogger.Instance, fileProvider, contentType, subPath); + + var result = context.LookupFileInfo(); + Assert.True(validateResult); + Assert.True(contentTypeResult); + Assert.True(result); + + await context.SendAsync(); + + Assert.Equal(0, body.Length); + } + private sealed class TestFileProvider : IFileProvider { private readonly Dictionary _files = new Dictionary(StringComparer.Ordinal); From c9f75a1f41911e3ff8fb180a8a404d2506cb33db Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Fri, 17 Jul 2020 19:37:20 +0000 Subject: [PATCH 03/16] Merged PR 9163: [3.1] Fix HttSys tests The 3.1 PR builds aren't working so I missed some new test failures caused by my prior change. https://dev.azure.com/dnceng/internal/_build/results?buildId=734369&view=ms.vss-test-web.build-test-results-tab HttpSys has some odd behavior when you call SendFileAsync multiple times on an aborted response. The first time throws an OperationCancelledException, but the second time throws an ObjectDisposedException. This only happens if you enable HttpSysOptions.ThrowWriteExceptions and pass in a cancelled token. https://github.com/dotnet/aspnetcore/blob/472fc5058ecbddd4cd546a40628ec5a0545b8125/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs#L577 I'm not aware of any scenarios where SendFileAsync is called multiple times like this, so for now I'm only fixing up the tests. --- .../FunctionalTests/ResponseSendFileTests.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Servers/HttpSys/test/FunctionalTests/ResponseSendFileTests.cs b/src/Servers/HttpSys/test/FunctionalTests/ResponseSendFileTests.cs index 1bda0ddee12f..8d54a67a536d 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/ResponseSendFileTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/ResponseSendFileTests.cs @@ -487,17 +487,21 @@ public async Task ResponseSendFileExceptions_ClientDisconnectsBeforeFirstSend_Se try { + // Note Response.SendFileAsync uses RequestAborted by default. This can cause the response to be disposed + // before it throws an IOException, but there's a race depending on when the disconnect is noticed. + // Passing our own token to skip that. + using var cts = new CancellationTokenSource(); await Assert.ThrowsAsync(async () => { // It can take several tries before Send notices the disconnect. for (int i = 0; i < Utilities.WriteRetryLimit; i++) { - await httpContext.Response.SendFileAsync(AbsoluteFilePath, 0, null); + await httpContext.Response.SendFileAsync(AbsoluteFilePath, 0, null, cts.Token); } }); await Assert.ThrowsAsync(() => - httpContext.Response.SendFileAsync(AbsoluteFilePath, 0, null)); + httpContext.Response.SendFileAsync(AbsoluteFilePath, 0, null, cts.Token)); testComplete.SetResult(0); } @@ -573,9 +577,13 @@ public async Task ResponseSendFileExceptions_ClientDisconnectsBeforeSecondSend_S var testComplete = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (Utilities.CreateHttpServer(out var address, async httpContext => { + // Note Response.SendFileAsync uses RequestAborted by default. This can cause the response to be disposed + // before it throws an IOException, but there's a race depending on when the disconnect is noticed. + // Passing our own token to skip that. + using var cts = new CancellationTokenSource(); httpContext.RequestAborted.Register(() => cancellationReceived.SetResult(0)); // First write sends headers - await httpContext.Response.SendFileAsync(AbsoluteFilePath, 0, null); + await httpContext.Response.SendFileAsync(AbsoluteFilePath, 0, null, cts.Token); firstSendComplete.SetResult(0); await clientDisconnected.Task; @@ -586,7 +594,7 @@ await Assert.ThrowsAsync(async () => // It can take several tries before Write notices the disconnect. for (int i = 0; i < Utilities.WriteRetryLimit; i++) { - await httpContext.Response.SendFileAsync(AbsoluteFilePath, 0, null, CancellationToken.None); + await httpContext.Response.SendFileAsync(AbsoluteFilePath, 0, null, cts.Token); } }); From 40383cf1f9417b7018b51d02b72afdf1cfa1705b Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Mon, 20 Jul 2020 19:11:17 +0000 Subject: [PATCH 04/16] Merged PR 9189: Modify WebSockets ValueTaskSource Create the GCHandle per operation and Free it when resetting the ValueTaskSource for re-use. --- .../IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs | 6 ++++-- .../IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Write.cs | 6 ++++-- src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs index 2dac1a234e7d..db4068c52c3d 100644 --- a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs +++ b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs @@ -25,7 +25,7 @@ internal class WebSocketReadOperation : AsyncIOOperation }; private readonly WebSocketsAsyncIOEngine _engine; - private readonly GCHandle _thisHandle; + private GCHandle _thisHandle; private MemoryHandle _inputHandle; private IntPtr _requestHandler; private Memory _memory; @@ -33,11 +33,11 @@ internal class WebSocketReadOperation : AsyncIOOperation public WebSocketReadOperation(WebSocketsAsyncIOEngine engine) { _engine = engine; - _thisHandle = GCHandle.Alloc(this); } protected override unsafe bool InvokeOperation(out int hr, out int bytes) { + _thisHandle = GCHandle.Alloc(this); _inputHandle = _memory.Pin(); hr = NativeMethods.HttpWebsocketsReadBytes( @@ -67,6 +67,8 @@ protected override void ResetOperation() { base.ResetOperation(); + _thisHandle.Free(); + _memory = default; _inputHandle.Dispose(); _inputHandle = default; diff --git a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Write.cs b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Write.cs index 3eff3bba4609..5e6630aae5bd 100644 --- a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Write.cs +++ b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Write.cs @@ -25,16 +25,16 @@ internal sealed class WebSocketWriteOperation : AsyncWriteOperationBase }; private readonly WebSocketsAsyncIOEngine _engine; - private readonly GCHandle _thisHandle; + private GCHandle _thisHandle; public WebSocketWriteOperation(WebSocketsAsyncIOEngine engine) { _engine = engine; - _thisHandle = GCHandle.Alloc(this); } protected override unsafe int WriteChunks(IntPtr requestHandler, int chunkCount, HttpApiTypes.HTTP_DATA_CHUNK* dataChunks, out bool completionExpected) { + _thisHandle = GCHandle.Alloc(this); return NativeMethods.HttpWebsocketsWriteBytes(requestHandler, dataChunks, chunkCount, WriteCallback, (IntPtr)_thisHandle, out completionExpected); } @@ -42,6 +42,8 @@ protected override void ResetOperation() { base.ResetOperation(); + _thisHandle.Free(); + _engine.ReturnOperation(this); } } diff --git a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs index a796af23b34e..2c1ac02e2031 100644 --- a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs +++ b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs @@ -39,7 +39,7 @@ public ValueTask ReadAsync(Memory memory) var read = GetReadOperation(); read.Initialize(_handler, memory); read.Invoke(); - return new ValueTask(read, 0); + return new ValueTask(read, 0); } } From 84562dd7d29ac4c8a217fa990e6fee69cd3ef7d4 Mon Sep 17 00:00:00 2001 From: DotNet Bot Date: Wed, 22 Jul 2020 17:57:32 +0000 Subject: [PATCH 05/16] Merged PR 9096: [internal/release/3.1] Update dependencies from dnceng/internal/dotnet-aspnetcore-tooling This pull request updates the following dependencies [marker]: <> (Begin:7bf32a0c-3505-43af-42b0-08d79559e63d) ## From https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore-tooling - **Subscription**: 7bf32a0c-3505-43af-42b0-08d79559e63d - **Build**: 20200721.7 - **Date Produced**: 7/22/2020 4:18 AM - **Commit**: 1c22292bc7fca352074d8862cf39fbdb8647f208 - **Branch**: refs/heads/internal/release/3.1 - **Updates**: - **Microsoft.AspNetCore.Razor.Language**: from 3.1.6 to 3.1.7 - **Microsoft.CodeAnalysis.Razor**: from 3.1.6 to 3.1.7 - **Microsoft.NET.Sdk.Razor**: from 3.1.6 to 3.1.7 - **Microsoft.AspNetCore.Mvc.Razor.Extensions**: from 3.1.6 to 3.1.7 [marker]: <> (End:7bf32a0c-3505-43af-42b0-08d79559e63d) --- NuGet.config | 7 +++++++ eng/Version.Details.xml | 16 ++++++++-------- eng/Versions.props | 10 ++++------ 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/NuGet.config b/NuGet.config index 389b3f7ed6f4..9c8c3933d78e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -4,6 +4,13 @@ + + + + + + + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3a9f5d77a7e7..bb642c2368db 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -17,21 +17,21 @@ https://github.com/dotnet/corefx 66409e392d64ed96e5d3a5fda712d9baf51196ed - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore-tooling - d63ec4a166a5c4f40fcbb823873cfa68cfd39eae + 1c22292bc7fca352074d8862cf39fbdb8647f208 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore-tooling - d63ec4a166a5c4f40fcbb823873cfa68cfd39eae + 1c22292bc7fca352074d8862cf39fbdb8647f208 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore-tooling - d63ec4a166a5c4f40fcbb823873cfa68cfd39eae + 1c22292bc7fca352074d8862cf39fbdb8647f208 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore-tooling - d63ec4a166a5c4f40fcbb823873cfa68cfd39eae + 1c22292bc7fca352074d8862cf39fbdb8647f208 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore diff --git a/eng/Versions.props b/eng/Versions.props index 745665acd695..955550b50a80 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -10,11 +10,9 @@ 1 7 0 - 3 2 1 - @@ -172,10 +170,10 @@ 3.1.6 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + - - - + + + + + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index bb642c2368db..d3b822832f8e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -33,261 +33,261 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore-tooling 1c22292bc7fca352074d8862cf39fbdb8647f208 - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 509fe041d6d740af8122cae870bf58f2c33c38f3 + cad165e731fc0bcc9ab725c718177ebaf0820705 - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 509fe041d6d740af8122cae870bf58f2c33c38f3 + cad165e731fc0bcc9ab725c718177ebaf0820705 - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 509fe041d6d740af8122cae870bf58f2c33c38f3 + cad165e731fc0bcc9ab725c718177ebaf0820705 - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 509fe041d6d740af8122cae870bf58f2c33c38f3 + cad165e731fc0bcc9ab725c718177ebaf0820705 - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 509fe041d6d740af8122cae870bf58f2c33c38f3 + cad165e731fc0bcc9ab725c718177ebaf0820705 - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 509fe041d6d740af8122cae870bf58f2c33c38f3 + cad165e731fc0bcc9ab725c718177ebaf0820705 - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 509fe041d6d740af8122cae870bf58f2c33c38f3 + cad165e731fc0bcc9ab725c718177ebaf0820705 - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde https://dev.azure.com/dnceng/internal/_git/dotnet-corefx @@ -377,25 +377,25 @@ https://github.com/dotnet/corefx 0f7f38c4fd323b26da10cce95f857f77f0f09b48 - - https://dev.azure.com/dnceng/internal/_git/dotnet-core-setup - 3acd9b0cd16596bad450c82be08780875a73c05c + + https://github.com/dotnet/core-setup + 2d163b87b605fd23ceebfb04484e5ec5f2bffc32 - + https://dev.azure.com/dnceng/internal/_git/dotnet-core-setup - 3acd9b0cd16596bad450c82be08780875a73c05c + fcfdef8d6ba770e4d7ba9efefe2591d8c33a1fc6 https://github.com/dotnet/core-setup 7d57652f33493fa022125b7f63aad0d70c52d810 - + https://dev.azure.com/dnceng/internal/_git/dotnet-core-setup - 3acd9b0cd16596bad450c82be08780875a73c05c + fcfdef8d6ba770e4d7ba9efefe2591d8c33a1fc6 @@ -409,13 +409,13 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-corefx - 059a4a19e602494bfbed473dbbb18f2dbfbd0878 + 36b8b8e26a8e2e06e000f59e19910d117bf0025b - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde https://github.com/dotnet/arcade @@ -429,9 +429,9 @@ https://github.com/dotnet/arcade 1a55276ab9d16792cec595ba870df39a9d97d5ca - + https://dev.azure.com/dnceng/internal/_git/dotnet-extensions - be18161fbed286d6fb7a7b1c7999ce70a50cf3eb + 784b0ffaa40779255758ebbb146334da489a4bde https://github.com/dotnet/roslyn diff --git a/eng/Versions.props b/eng/Versions.props index 955550b50a80..4b4a752dc06f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -67,10 +67,10 @@ 3.4.1-beta4-20127-10 - 3.1.6 - 3.1.6-servicing.20316.4 + 3.1.3 + 3.1.7-servicing.20371.4 3.1.0 - 3.1.6 + 3.1.7 2.1.0 1.1.1 @@ -97,78 +97,78 @@ 4.7.1 4.7.0 - 3.1.1 + 3.1.2 3.2.0 - 3.1.6-servicing.20316.5 - 3.1.6-servicing.20316.5 - 3.1.6-servicing.20316.5 - 3.1.6-servicing.20316.5 - 3.1.6-servicing.20316.5 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6-servicing.20316.5 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6-servicing.20316.5 - 3.1.6 - 3.1.6 - 3.1.6-servicing.20316.5 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6-servicing.20316.5 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6-servicing.20316.5 - 3.1.6 - 3.1.6-servicing.20316.5 - 3.1.6-servicing.20316.5 - 3.1.6 + 3.1.7-servicing.20371.8 + 3.1.7-servicing.20371.8 + 3.1.7-servicing.20371.8 + 3.1.7-servicing.20371.8 + 3.1.7-servicing.20371.8 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7-servicing.20371.8 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7-servicing.20371.8 + 3.1.7 + 3.1.7 + 3.1.7-servicing.20371.8 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7-servicing.20371.8 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7-servicing.20371.8 + 3.1.7 + 3.1.7-servicing.20371.8 + 3.1.7-servicing.20371.8 + 3.1.7 3.1.0-rtm.19565.4 - 3.1.6 + 3.1.7 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 - 3.1.6 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 + 3.1.7 3.1.7 3.1.7 From 94076d4a093eba361f632f2c0cd5c84c3c08a083 Mon Sep 17 00:00:00 2001 From: Michael Stuckey Date: Tue, 28 Jul 2020 10:25:30 -0700 Subject: [PATCH 07/16] Use legacy MyGet feeds (#23929) --- build/sources.props | 4 +--- src/AzureIntegration/build/repo.targets | 2 +- src/AzureIntegration/build/sources.props | 5 ++--- .../Assets/NuGet.latest.config | 2 +- .../ANCMPackageResolver/ANCMPackageResolver.csproj | 2 +- src/Templating/build/sources.props | 5 ++--- test/Cli.FunctionalTests/NuGetPackageSource.cs | 2 +- 7 files changed, 9 insertions(+), 13 deletions(-) diff --git a/build/sources.props b/build/sources.props index 9567ad020c5a..ce630b7d4969 100644 --- a/build/sources.props +++ b/build/sources.props @@ -14,9 +14,7 @@ $(RestoreSources); - https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-master/api/v3/index.json; - https://dotnet.myget.org/F/roslyn/api/v3/index.json; + https://pkgs.dev.azure.com/dnceng/public/_packaging/myget-legacy/nuget/v3/index.json; https://pkgs.dev.azure.com/azure-public/vside/_packaging/vssdk/nuget/v3/index.json; https://pkgs.dev.azure.com/azure-public/vside/_packaging/vs-impl/nuget/v3/index.json; diff --git a/src/AzureIntegration/build/repo.targets b/src/AzureIntegration/build/repo.targets index 856963004f05..3d02fefc785d 100644 --- a/src/AzureIntegration/build/repo.targets +++ b/src/AzureIntegration/build/repo.targets @@ -12,7 +12,7 @@ $(TestDotNetPath)extension\$(SiteExtensionArch)\ $(RepositoryRoot)artifacts\build $(RepositoryRoot)\test\Microsoft.AspNetCore.AzureAppServices.FunctionalTests\ - https://dotnet.myget.org/F/aspnetcore-dev/ + https://pkgs.dev.azure.com/dnceng/public/_packaging/myget-legacy/nuget/v3/index.json diff --git a/src/AzureIntegration/build/sources.props b/src/AzureIntegration/build/sources.props index 9215df9751b4..9eb344de868a 100644 --- a/src/AzureIntegration/build/sources.props +++ b/src/AzureIntegration/build/sources.props @@ -5,9 +5,8 @@ $(DotNetRestoreSources) $(RestoreSources); - https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; + https://dotnetmygetlegacy.blob.core.windows.net/dotnet-core/index.json; + https://pkgs.dev.azure.com/dnceng/public/_packaging/myget-legacy/nuget/v3/index.json; $(RestoreSources); diff --git a/src/AzureIntegration/test/Microsoft.AspNetCore.AzureAppServices.FunctionalTests/Assets/NuGet.latest.config b/src/AzureIntegration/test/Microsoft.AspNetCore.AzureAppServices.FunctionalTests/Assets/NuGet.latest.config index 4a06556f1ca3..579b3556976b 100644 --- a/src/AzureIntegration/test/Microsoft.AspNetCore.AzureAppServices.FunctionalTests/Assets/NuGet.latest.config +++ b/src/AzureIntegration/test/Microsoft.AspNetCore.AzureAppServices.FunctionalTests/Assets/NuGet.latest.config @@ -2,7 +2,7 @@ - + diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMPackageResolver/ANCMPackageResolver.csproj b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMPackageResolver/ANCMPackageResolver.csproj index eb17758d7527..0ecdcd3765b8 100644 --- a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMPackageResolver/ANCMPackageResolver.csproj +++ b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMPackageResolver/ANCMPackageResolver.csproj @@ -19,7 +19,7 @@ $(RestoreSources); https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json; https://api.nuget.org/v3/index.json; - https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; + https://dotnetmygetlegacy.blob.core.windows.net/dotnet-core/index.json; diff --git a/src/Templating/build/sources.props b/src/Templating/build/sources.props index 9215df9751b4..9eb344de868a 100644 --- a/src/Templating/build/sources.props +++ b/src/Templating/build/sources.props @@ -5,9 +5,8 @@ $(DotNetRestoreSources) $(RestoreSources); - https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; + https://dotnetmygetlegacy.blob.core.windows.net/dotnet-core/index.json; + https://pkgs.dev.azure.com/dnceng/public/_packaging/myget-legacy/nuget/v3/index.json; $(RestoreSources); diff --git a/test/Cli.FunctionalTests/NuGetPackageSource.cs b/test/Cli.FunctionalTests/NuGetPackageSource.cs index e1bbce195a33..cc155ecd109d 100644 --- a/test/Cli.FunctionalTests/NuGetPackageSource.cs +++ b/test/Cli.FunctionalTests/NuGetPackageSource.cs @@ -23,7 +23,7 @@ public class NuGetPackageSource public static NuGetPackageSource DotNetCore { get; } = new NuGetPackageSource { Name = nameof(DotNetCore), - SourceArgumentLazy = new Lazy("--source https://dotnet.myget.org/F/dotnet-core/api/v3/index.json"), + SourceArgumentLazy = new Lazy("--source https://dotnetmygetlegacy.blob.core.windows.net/dotnet-core/index.json"), }; public static NuGetPackageSource EnvironmentVariable { get; } = new NuGetPackageSource From 9f03b0acffd557a179b28a683c9016f94e500d66 Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Sat, 8 Aug 2020 14:18:33 -0700 Subject: [PATCH 08/16] Update branding to 3.1.8 - build targeting pack to pick up NuGet/Home#8599 fix - dotnet/extensions#2750 and #24200 2/2 - requires follow-up after next official extensions build - fake the baseline update - remainder must be done after the 3.1.7 release --- Directory.Build.props | 4 ++-- eng/Baseline.Designer.props | 2 +- eng/Baseline.xml | 4 ++-- eng/Version.Details.xml | 9 +++++---- eng/Versions.props | 5 +++-- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 53865f2cfb49..0f51f5d3110a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -84,10 +84,10 @@ aspnetcore-runtime aspnetcore-targeting-pack - + false false + Condition=" '$(IsTargetingPackBuilding)' == '' AND '$(AspNetCorePatchVersion)' != '8' ">false true diff --git a/eng/Baseline.xml b/eng/Baseline.xml index 650550d17918..f04e5b103428 100644 --- a/eng/Baseline.xml +++ b/eng/Baseline.xml @@ -4,7 +4,7 @@ This file contains a list of all the packages and their versions which were rele Update this list when preparing for a new patch. --> - + @@ -87,4 +87,4 @@ Update this list when preparing for a new patch. - \ No newline at end of file + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index d3b822832f8e..ba13e2034220 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -381,6 +381,11 @@ https://github.com/dotnet/core-setup 2d163b87b605fd23ceebfb04484e5ec5f2bffc32 + + + https://github.com/dotnet/Extensions + 4e1be2fb546751c773968d7b40ff7f4b62887153 + diff --git a/eng/Versions.props b/eng/Versions.props index 4b4a752dc06f..f0543e4a5464 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -8,7 +8,7 @@ 3 1 - 7 + 8 0 3 2 @@ -24,6 +24,7 @@ Servicing $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion) + 3.1.0 false @@ -34,7 +35,7 @@ $(VersionPrefix) - $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).3 + $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).8 0.3.$(AspNetCorePatchVersion) $([MSBuild]::Add(10, $(AspNetCoreMajorVersion))) From 522088b6beb5a11b431b2dea6e2e94f6003d689a Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Sat, 8 Aug 2020 16:23:35 -0700 Subject: [PATCH 09/16] Do not run hostname tests on macOS --- .../TransportTestHelpers/HostNameIsReachableAttribute.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Servers/Kestrel/shared/test/TransportTestHelpers/HostNameIsReachableAttribute.cs b/src/Servers/Kestrel/shared/test/TransportTestHelpers/HostNameIsReachableAttribute.cs index b489a110fbc6..67dbeed36488 100644 --- a/src/Servers/Kestrel/shared/test/TransportTestHelpers/HostNameIsReachableAttribute.cs +++ b/src/Servers/Kestrel/shared/test/TransportTestHelpers/HostNameIsReachableAttribute.cs @@ -4,6 +4,7 @@ using System; using System.Net; using System.Net.Sockets; +using System.Runtime.InteropServices; using System.Threading.Tasks; using Microsoft.AspNetCore.Testing; @@ -30,6 +31,12 @@ public bool IsMet private async Task HostNameIsReachable() { + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + // Code below is unreliable on macOS and tests fail on that platform. + return false; + } + try { _hostname = Dns.GetHostName(); From 5d1a8b454cb5f67a913ed1743ed51db1f4d1cb38 Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Tue, 11 Aug 2020 10:47:33 -0700 Subject: [PATCH 10/16] Remove internal feeds --- NuGet.config | 7 ------- 1 file changed, 7 deletions(-) diff --git a/NuGet.config b/NuGet.config index 4a97f9942a02..2323cdac01a6 100644 --- a/NuGet.config +++ b/NuGet.config @@ -7,13 +7,6 @@ - - - - - - - From 8f21d61c089cca3bd76eadf68dfcdc4e318516df Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Tue, 11 Aug 2020 15:02:23 -0700 Subject: [PATCH 11/16] Update to 3.1.107 SDK --- global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 023704b7ac3e..4c34e6afa2cf 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "3.1.103" + "version": "3.1.107" }, "tools": { - "dotnet": "3.1.103", + "dotnet": "3.1.107", "runtimes": { "dotnet/x64": [ "$(MicrosoftNETCoreAppInternalPackageVersion)" From 1709e5badbb93b758afa4c8c0d079d800461a821 Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Tue, 11 Aug 2020 16:31:09 -0700 Subject: [PATCH 12/16] Update Baseline.* files --- eng/Baseline.Designer.props | 432 ++++++++++++++++++------------------ eng/Baseline.xml | 146 ++++++------ 2 files changed, 289 insertions(+), 289 deletions(-) diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props index 6c72f1aa422d..c4f0bf31d397 100644 --- a/eng/Baseline.Designer.props +++ b/eng/Baseline.Designer.props @@ -16,7 +16,7 @@ - 3.1.6 + 3.1.7 @@ -27,88 +27,88 @@ - 3.1.6 + 3.1.7 - - - + + + - + - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - - + + - 3.1.6 + 3.1.7 - - + + - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 @@ -116,97 +116,97 @@ - 3.1.6 + 3.1.7 - - - + + + - - - + + + - 3.1.6 + 3.1.7 - - + + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - - - + + + - - - + + + - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - - + + - - + + - 3.1.6 + 3.1.7 - + - + - 3.1.6 + 3.1.7 - - - - + + + + - - - - + + + + @@ -253,219 +253,219 @@ - 3.1.6 + 3.1.7 - - + + - 3.1.6 + 3.1.7 - + - + - + - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - + - + - + - 3.1.6 + 3.1.7 - - - - - - + + + + + + - - - - - - + + + + + + - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - - + + - 3.1.6 + 3.1.7 - - + + - - + + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - - + + - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - - - + + + - - - + + + - 3.1.6 + 3.1.7 - + - + - 3.1.6 + 3.1.7 - + - + - 3.1.6 + 3.1.7 - - + + - - + + - 3.1.6 + 3.1.7 - - - + + + - 3.1.6 + 3.1.7 - - + + - 3.1.6 + 3.1.7 @@ -473,239 +473,239 @@ - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - - - + + + - 3.1.6 + 3.1.7 - - - + + + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - + - - + + - 3.1.6 + 3.1.7 - - + + - 3.1.6 + 3.1.7 - - + + - - + + - - - - + + + + - 3.1.6 + 3.1.7 - - + + - - + + - 3.1.6 + 3.1.7 - + - + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - - - - + + + + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - + - 3.1.6 + 3.1.7 - - + + - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - 3.1.6 + 3.1.7 - - - + + + - 3.1.6 + 3.1.7 - - - + + + - - - + + + - 3.1.6 + 3.1.7 - - - + + + - - - + + + \ No newline at end of file diff --git a/eng/Baseline.xml b/eng/Baseline.xml index f04e5b103428..ca3b6217b81f 100644 --- a/eng/Baseline.xml +++ b/eng/Baseline.xml @@ -7,84 +7,84 @@ Update this list when preparing for a new patch. - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 95386ff08a17ea76b8ecdfc60e5ff9c5ab582e9b Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Tue, 11 Aug 2020 16:34:21 -0700 Subject: [PATCH 13/16] Undo package downgrade --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ba13e2034220..7072fce60737 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -377,14 +377,14 @@ https://github.com/dotnet/corefx 0f7f38c4fd323b26da10cce95f857f77f0f09b48 - + https://github.com/dotnet/core-setup 2d163b87b605fd23ceebfb04484e5ec5f2bffc32 https://github.com/dotnet/Extensions - 4e1be2fb546751c773968d7b40ff7f4b62887153 + 3acd9b0cd16596bad450c82be08780875a73c05c 3.4.1-beta4-20127-10 - 3.1.3 + 3.1.6 3.1.7-servicing.20371.4 3.1.0 3.1.7 From 2cb52f06b229b4c92e6429eeb621608fa1fcfdb1 Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Tue, 11 Aug 2020 21:19:18 -0700 Subject: [PATCH 14/16] Update branding to 2.1.22 --- eng/Baseline.Designer.props | 10 +++++----- eng/Baseline.xml | 6 +++--- eng/PatchConfig.props | 4 ++++ .../ArchiveBaseline.2.1.21.txt | 1 + .../Archive.CiServer.Patch/ArchiveBaseline.2.1.21.txt | 1 + version.props | 2 +- 6 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 src/PackageArchive/Archive.CiServer.Patch.Compat/ArchiveBaseline.2.1.21.txt create mode 100644 src/PackageArchive/Archive.CiServer.Patch/ArchiveBaseline.2.1.21.txt diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props index 11119cef2fcc..0060a1c36124 100644 --- a/eng/Baseline.Designer.props +++ b/eng/Baseline.Designer.props @@ -2,7 +2,7 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.20 + 2.1.21 @@ -477,13 +477,13 @@ - 2.1.1 + 2.1.21 - - + + @@ -859,7 +859,7 @@ - 2.1.1 + 2.1.21 diff --git a/eng/Baseline.xml b/eng/Baseline.xml index 398381dcad0e..ce240e5f6944 100644 --- a/eng/Baseline.xml +++ b/eng/Baseline.xml @@ -4,7 +4,7 @@ This file contains a list of all the packages and their versions which were rele build of ASP.NET Core 2.1.x. Update this list when preparing for a new patch. --> - + @@ -54,7 +54,7 @@ build of ASP.NET Core 2.1.x. Update this list when preparing for a new patch. - + @@ -93,7 +93,7 @@ build of ASP.NET Core 2.1.x. Update this list when preparing for a new patch. - + diff --git a/eng/PatchConfig.props b/eng/PatchConfig.props index 6f17fb8dec12..40c0413b43b3 100644 --- a/eng/PatchConfig.props +++ b/eng/PatchConfig.props @@ -72,4 +72,8 @@ Later on, this will be checked using this condition: Microsoft.AspNetCore.ResponseCompression; + + + + diff --git a/src/PackageArchive/Archive.CiServer.Patch.Compat/ArchiveBaseline.2.1.21.txt b/src/PackageArchive/Archive.CiServer.Patch.Compat/ArchiveBaseline.2.1.21.txt new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/src/PackageArchive/Archive.CiServer.Patch.Compat/ArchiveBaseline.2.1.21.txt @@ -0,0 +1 @@ + diff --git a/src/PackageArchive/Archive.CiServer.Patch/ArchiveBaseline.2.1.21.txt b/src/PackageArchive/Archive.CiServer.Patch/ArchiveBaseline.2.1.21.txt new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/src/PackageArchive/Archive.CiServer.Patch/ArchiveBaseline.2.1.21.txt @@ -0,0 +1 @@ + diff --git a/version.props b/version.props index e0df5c7e110c..684ab9f01130 100644 --- a/version.props +++ b/version.props @@ -2,7 +2,7 @@ 2 1 - 21 + 22 servicing Servicing t000 From 7fc3da231c4e14c251584bd324a3f08f12f4b763 Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Tue, 11 Aug 2020 21:30:24 -0700 Subject: [PATCH 15/16] Update EF submodule --- modules/EntityFrameworkCore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/EntityFrameworkCore b/modules/EntityFrameworkCore index e7a4277846e7..1e01d4f9c2e8 160000 --- a/modules/EntityFrameworkCore +++ b/modules/EntityFrameworkCore @@ -1 +1 @@ -Subproject commit e7a4277846e720fb8a5729c2a3de98c4c2ff67e5 +Subproject commit 1e01d4f9c2e8727c9b475552025b2d493993045d From 06f86cd6430da9eeab875da06e2ff22d43a184ad Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Wed, 12 Aug 2020 10:41:54 -0700 Subject: [PATCH 16/16] Do not run hostname tests on macOS - ports 522088b6be to this branch --- .../TransportTestHelpers/HostNameIsReachableAttribute.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Servers/Kestrel/shared/test/TransportTestHelpers/HostNameIsReachableAttribute.cs b/src/Servers/Kestrel/shared/test/TransportTestHelpers/HostNameIsReachableAttribute.cs index 5a83bd7c3f88..72415db043fb 100644 --- a/src/Servers/Kestrel/shared/test/TransportTestHelpers/HostNameIsReachableAttribute.cs +++ b/src/Servers/Kestrel/shared/test/TransportTestHelpers/HostNameIsReachableAttribute.cs @@ -4,6 +4,7 @@ using System; using System.Net; using System.Net.Sockets; +using System.Runtime.InteropServices; using System.Threading.Tasks; using Microsoft.AspNetCore.Testing.xunit; @@ -30,6 +31,12 @@ public bool IsMet private async Task HostNameIsReachable() { + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + // Code below is unreliable on macOS and tests fail on that platform. + return false; + } + try { _hostname = Dns.GetHostName();