diff --git a/src/StaticFiles/Directory.Build.props b/src/StaticFiles/Directory.Build.props index 2c2d9cc9d0..c46c5e323b 100644 --- a/src/StaticFiles/Directory.Build.props +++ b/src/StaticFiles/Directory.Build.props @@ -14,7 +14,6 @@ $(MSBuildThisFileDirectory) $(MSBuildThisFileDirectory)build\Key.snk true - true true diff --git a/src/StaticFiles/Directory.Build.targets b/src/StaticFiles/Directory.Build.targets index 53b3f6e1da..78626b773e 100644 --- a/src/StaticFiles/Directory.Build.targets +++ b/src/StaticFiles/Directory.Build.targets @@ -1,7 +1,10 @@ - + $(MicrosoftNETCoreApp20PackageVersion) $(MicrosoftNETCoreApp21PackageVersion) + $(MicrosoftNETCoreApp22PackageVersion) $(NETStandardLibrary20PackageVersion) + + 99.9 diff --git a/src/StaticFiles/StaticFiles.sln b/src/StaticFiles/StaticFiles.sln index 0e5ab3b48f..d35843bf61 100644 --- a/src/StaticFiles/StaticFiles.sln +++ b/src/StaticFiles/StaticFiles.sln @@ -31,6 +31,19 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.AspNetCore.RangeH shared\Microsoft.AspNetCore.RangeHelper.Sources\RangeHelper.cs = shared\Microsoft.AspNetCore.RangeHelper.Sources\RangeHelper.cs EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DE015849-E126-4DFA-A754-E1AC3B1E7925}" + ProjectSection(SolutionItems) = preProject + .appveyor.yml = .appveyor.yml + .travis.yml = .travis.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{D3F67455-9FB9-4354-93EC-B05D755114E9}" + ProjectSection(SolutionItems) = preProject + build\dependencies.props = build\dependencies.props + build\repo.props = build\repo.props + build\sources.props = build\sources.props + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -106,5 +119,9 @@ Global {FDF0539C-1F62-4B78-91B1-C687886931CA} = {EF02AFE8-7C15-4DDB-8B2C-58A676112A98} {D3D752C4-4CDF-4F18-AC7F-48CB980A69DA} = {EF02AFE8-7C15-4DDB-8B2C-58A676112A98} {DB6A1D14-B8A2-488F-9C4B-422FD45C8853} = {360DC2F8-EEB4-4C69-9784-C686EAD78279} + {D3F67455-9FB9-4354-93EC-B05D755114E9} = {DE015849-E126-4DFA-A754-E1AC3B1E7925} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AF7F03BE-0DB2-48EF-8185-7698995658A6} EndGlobalSection EndGlobal diff --git a/src/StaticFiles/build/dependencies.props b/src/StaticFiles/build/dependencies.props index 531f1f0941..aeb5a7c33c 100644 --- a/src/StaticFiles/build/dependencies.props +++ b/src/StaticFiles/build/dependencies.props @@ -2,38 +2,32 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - 2.1.3-rtm-15802 - 2.0.0 - 2.1.2 + + 2.2.0-preview2-20181004.6 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 0.6.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.2.0-preview3-35425 + 2.0.9 + 2.1.3 + 2.2.0-preview3-27001-02 15.6.1 4.7.49 2.0.3 - 0.8.0 + 0.10.0 2.3.1 - 2.4.0-beta.1.build3945 + 2.4.0 - - - - - - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 0.5.1 - 2.1.2 - 2.1.1 - 2.1.0 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - - \ No newline at end of file + + diff --git a/src/StaticFiles/build/repo.props b/src/StaticFiles/build/repo.props index dab1601c88..f1fe24dd27 100644 --- a/src/StaticFiles/build/repo.props +++ b/src/StaticFiles/build/repo.props @@ -4,12 +4,13 @@ Internal.AspNetCore.Universe.Lineup - 2.1.0-rc1-* + 2.2.0-* https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json + diff --git a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DefaultFilesMiddleware.cs b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DefaultFilesMiddleware.cs index a401759b3d..3c3a1c60b8 100644 --- a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DefaultFilesMiddleware.cs +++ b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DefaultFilesMiddleware.cs @@ -62,9 +62,8 @@ namespace Microsoft.AspNetCore.StaticFiles /// public Task Invoke(HttpContext context) { - PathString subpath; if (Helpers.IsGetOrHeadMethod(context.Request.Method) - && Helpers.TryMatchPath(context, _matchUrl, forDirectory: true, subpath: out subpath)) + && Helpers.TryMatchPath(context, _matchUrl, forDirectory: true, subpath: out var subpath)) { var dirContents = _fileProvider.GetDirectoryContents(subpath.Value); if (dirContents.Exists) @@ -73,7 +72,7 @@ namespace Microsoft.AspNetCore.StaticFiles for (int matchIndex = 0; matchIndex < _options.DefaultFileNames.Count; matchIndex++) { string defaultFile = _options.DefaultFileNames[matchIndex]; - var file = _fileProvider.GetFileInfo(subpath + defaultFile); + var file = _fileProvider.GetFileInfo(subpath.Value + defaultFile); // TryMatchPath will make sure subpath always ends with a "/" by adding it if needed. if (file.Exists) { diff --git a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DefaultFilesOptions.cs b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DefaultFilesOptions.cs index 72b577dfcc..646774315d 100644 --- a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DefaultFilesOptions.cs +++ b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DefaultFilesOptions.cs @@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Builder : base(sharedOptions) { // Prioritized list - DefaultFileNames = new List() + DefaultFileNames = new List { "default.htm", "default.html", diff --git a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DirectoryBrowserMiddleware.cs b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DirectoryBrowserMiddleware.cs index 71765d0459..0ac1258c83 100644 --- a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DirectoryBrowserMiddleware.cs +++ b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/DirectoryBrowserMiddleware.cs @@ -79,11 +79,9 @@ namespace Microsoft.AspNetCore.StaticFiles public Task Invoke(HttpContext context) { // Check if the URL matches any expected paths - PathString subpath; - IDirectoryContents contents; if (Helpers.IsGetOrHeadMethod(context.Request.Method) - && Helpers.TryMatchPath(context, _matchUrl, forDirectory: true, subpath: out subpath) - && TryGetDirectoryInfo(subpath, out contents)) + && Helpers.TryMatchPath(context, _matchUrl, forDirectory: true, subpath: out var subpath) + && TryGetDirectoryInfo(subpath, out var contents)) { // If the path matches a directory but does not end in a slash, redirect to add the slash. // This prevents relative links from breaking. diff --git a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/FileExtensionContentTypeProvider.cs b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/FileExtensionContentTypeProvider.cs index f2e8f1b788..ea5775c73e 100644 --- a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/FileExtensionContentTypeProvider.cs +++ b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/FileExtensionContentTypeProvider.cs @@ -331,7 +331,8 @@ namespace Microsoft.AspNetCore.StaticFiles { ".vsto", "application/x-ms-vsto" }, { ".vsw", "application/vnd.visio" }, { ".vsx", "application/vnd.visio" }, - { ".vtx", "application/vnd.visio" }, + { ".vtx", "application/vnd.visio" }, + { ".wasm", "application/wasm" }, { ".wav", "audio/wav" }, { ".wax", "audio/x-ms-wax" }, { ".wbmp", "image/vnd.wap.wbmp" }, @@ -456,4 +457,4 @@ namespace Microsoft.AspNetCore.StaticFiles return path.Substring(index); } } -} \ No newline at end of file +} diff --git a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/StaticFileContext.cs b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/StaticFileContext.cs index f5024dcb23..501be2d71c 100644 --- a/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/StaticFileContext.cs +++ b/src/StaticFiles/src/Microsoft.AspNetCore.StaticFiles/StaticFileContext.cs @@ -282,7 +282,7 @@ namespace Microsoft.AspNetCore.StaticFiles // it is not returned for 304, 412, and 416 _response.ContentLength = _length; } - _options.OnPrepareResponse(new StaticFileResponseContext() + _options.OnPrepareResponse(new StaticFileResponseContext { Context = _context, File = _fileInfo, @@ -360,8 +360,7 @@ namespace Microsoft.AspNetCore.StaticFiles return; } - long start, length; - _responseHeaders.ContentRange = ComputeContentRange(_range, out start, out length); + _responseHeaders.ContentRange = ComputeContentRange(_range, out var start, out var length); _response.ContentLength = length; ApplyResponseHeaders(Constants.Status206PartialContent); diff --git a/src/StaticFiles/test/Directory.Build.props b/src/StaticFiles/test/Directory.Build.props index c6e5ecaf30..eb9c44a2b9 100644 --- a/src/StaticFiles/test/Directory.Build.props +++ b/src/StaticFiles/test/Directory.Build.props @@ -1,10 +1,10 @@ - + - netcoreapp2.1 + netcoreapp2.2 $(DeveloperBuildTestTfms) - netcoreapp2.1;netcoreapp2.0 + $(StandardTestTfms);net461 diff --git a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.FunctionalTests/StaticFileMiddlewareTests.cs b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.FunctionalTests/StaticFileMiddlewareTests.cs index b2ba4a4f47..268accc699 100644 --- a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.FunctionalTests/StaticFileMiddlewareTests.cs +++ b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.FunctionalTests/StaticFileMiddlewareTests.cs @@ -15,25 +15,27 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.Common; using Microsoft.AspNetCore.Testing.xunit; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging.Testing; using Xunit; namespace Microsoft.AspNetCore.StaticFiles { - public class StaticFileMiddlewareTests + public class StaticFileMiddlewareTests : LoggedTest { [Fact] public async Task ReturnsNotFoundWithoutWwwroot() { - var baseAddress = "http://localhost:12345"; var builder = new WebHostBuilder() + .ConfigureServices(services => services.AddSingleton(LoggerFactory)) .UseKestrel() .Configure(app => app.UseStaticFiles()); - using (var server = builder.Start(baseAddress)) + using (var server = builder.Start(TestUrlHelper.GetTestUrl(ServerType.Kestrel))) { - using (var client = new HttpClient() { BaseAddress = new Uri(baseAddress) }) + using (var client = new HttpClient { BaseAddress = new Uri(server.GetAddress()) }) { var response = await client.GetAsync("TestDocument.txt"); @@ -45,22 +47,22 @@ namespace Microsoft.AspNetCore.StaticFiles [Fact] public async Task FoundFile_LastModifiedTrimsSeconds() { - var baseAddress = "http://localhost:12345"; var builder = new WebHostBuilder() + .ConfigureServices(services => services.AddSingleton(LoggerFactory)) .UseKestrel() .UseWebRoot(AppContext.BaseDirectory) .Configure(app => app.UseStaticFiles()); - using (var server = builder.Start(baseAddress)) + using (var server = builder.Start(TestUrlHelper.GetTestUrl(ServerType.Kestrel))) { - using (var client = new HttpClient() { BaseAddress = new Uri(baseAddress) }) + using (var client = new HttpClient { BaseAddress = new Uri(server.GetAddress()) }) { var last = File.GetLastWriteTimeUtc(Path.Combine(AppContext.BaseDirectory, "TestDocument.txt")); var response = await client.GetAsync("TestDocument.txt"); - var trimed = new DateTimeOffset(last.Year, last.Month, last.Day, last.Hour, last.Minute, last.Second, TimeSpan.Zero).ToUniversalTime(); + var trimmed = new DateTimeOffset(last.Year, last.Month, last.Day, last.Hour, last.Minute, last.Second, TimeSpan.Zero).ToUniversalTime(); - Assert.Equal(response.Content.Headers.LastModified.Value, trimed); + Assert.Equal(response.Content.Headers.LastModified.Value, trimmed); } } } @@ -86,20 +88,20 @@ namespace Microsoft.AspNetCore.StaticFiles private async Task FoundFile_Served(string baseUrl, string baseDir, string requestUrl) { - var baseAddress = "http://localhost:12345"; var builder = new WebHostBuilder() + .ConfigureServices(services => services.AddSingleton(LoggerFactory)) .UseKestrel() .UseWebRoot(Path.Combine(AppContext.BaseDirectory, baseDir)) - .Configure(app => app.UseStaticFiles(new StaticFileOptions() + .Configure(app => app.UseStaticFiles(new StaticFileOptions { RequestPath = new PathString(baseUrl), })); - using (var server = builder.Start(baseAddress)) + using (var server = builder.Start(TestUrlHelper.GetTestUrl(ServerType.Kestrel))) { var hostingEnvironment = server.Services.GetService(); - using (var client = new HttpClient() { BaseAddress = new Uri(baseAddress) }) + using (var client = new HttpClient { BaseAddress = new Uri(server.GetAddress()) }) { var fileInfo = hostingEnvironment.WebRootFileProvider.GetFileInfo(Path.GetFileName(requestUrl)); var response = await client.GetAsync(requestUrl); @@ -124,20 +126,20 @@ namespace Microsoft.AspNetCore.StaticFiles [MemberData(nameof(ExistingFiles))] public async Task HeadFile_HeadersButNotBodyServed(string baseUrl, string baseDir, string requestUrl) { - var baseAddress = "http://localhost:12345"; var builder = new WebHostBuilder() + .ConfigureServices(services => services.AddSingleton(LoggerFactory)) .UseKestrel() .UseWebRoot(Path.Combine(AppContext.BaseDirectory, baseDir)) - .Configure(app => app.UseStaticFiles(new StaticFileOptions() + .Configure(app => app.UseStaticFiles(new StaticFileOptions { RequestPath = new PathString(baseUrl), })); - using (var server = builder.Start(baseAddress)) + using (var server = builder.Start(TestUrlHelper.GetTestUrl(ServerType.Kestrel))) { var hostingEnvironment = server.Services.GetService(); - using (var client = new HttpClient() { BaseAddress = new Uri(baseAddress) }) + using (var client = new HttpClient { BaseAddress = new Uri(server.GetAddress()) }) { var fileInfo = hostingEnvironment.WebRootFileProvider.GetFileInfo(Path.GetFileName(requestUrl)); var request = new HttpRequestMessage(HttpMethod.Head, requestUrl); @@ -172,18 +174,18 @@ namespace Microsoft.AspNetCore.StaticFiles [OSSkipCondition(OperatingSystems.MacOSX)] public void ClientDisconnect_WebListener_NoWriteExceptionThrown() { - ClientDisconnect_NoWriteExceptionThrown(ServerType.WebListener); + ClientDisconnect_NoWriteExceptionThrown(ServerType.HttpSys); } private void ClientDisconnect_NoWriteExceptionThrown(ServerType serverType) { var interval = TimeSpan.FromSeconds(15); - var baseAddress = "http://localhost:12345"; var requestReceived = new ManualResetEvent(false); - var requestCacelled = new ManualResetEvent(false); + var requestCancelled = new ManualResetEvent(false); var responseComplete = new ManualResetEvent(false); Exception exception = null; var builder = new WebHostBuilder() + .ConfigureServices(services => services.AddSingleton(LoggerFactory)) .UseWebRoot(Path.Combine(AppContext.BaseDirectory)) .Configure(app => { @@ -192,7 +194,7 @@ namespace Microsoft.AspNetCore.StaticFiles try { requestReceived.Set(); - Assert.True(requestCacelled.WaitOne(interval), "not cancelled"); + Assert.True(requestCancelled.WaitOne(interval), "not cancelled"); Assert.True(context.RequestAborted.WaitHandle.WaitOne(interval), "not aborted"); await next(); } @@ -205,7 +207,7 @@ namespace Microsoft.AspNetCore.StaticFiles app.UseStaticFiles(); }); - if (serverType == ServerType.WebListener) + if (serverType == ServerType.HttpSys) { builder.UseHttpSys(); } @@ -214,15 +216,15 @@ namespace Microsoft.AspNetCore.StaticFiles builder.UseKestrel(); } - using (var server = builder.Start(baseAddress)) + using (var server = builder.Start(TestUrlHelper.GetTestUrl(serverType))) { // We don't use HttpClient here because it's disconnect behavior varies across platforms. - var socket = SendSocketRequestAsync(baseAddress, "/TestDocument1MB.txt"); + var socket = SendSocketRequestAsync(server.GetAddress(), "/TestDocument1MB.txt"); Assert.True(requestReceived.WaitOne(interval), "not received"); socket.LingerState = new LingerOption(true, 0); socket.Dispose(); - requestCacelled.Set(); + requestCancelled.Set(); Assert.True(responseComplete.WaitOne(interval), "not completed"); Assert.Null(exception); diff --git a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/CacheHeaderTests.cs b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/CacheHeaderTests.cs index 862346a9d8..7c70ce4551 100644 --- a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/CacheHeaderTests.cs +++ b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/CacheHeaderTests.cs @@ -69,7 +69,7 @@ namespace Microsoft.AspNetCore.StaticFiles [Theory] [MemberData(nameof(SupportedMethods))] - public async Task IfMatchShouldBeServedForAstrisk(HttpMethod method) + public async Task IfMatchShouldBeServedForAsterisk(HttpMethod method) { TestServer server = StaticFilesTestServer.Create(app => app.UseFileServer()); var req = new HttpRequestMessage(method, "http://localhost/SubFolder/extra.xml"); @@ -230,7 +230,7 @@ namespace Microsoft.AspNetCore.StaticFiles DateTimeOffset lastModified = resp1.Content.Headers.LastModified.Value; DateTimeOffset pastDate = lastModified.AddHours(-1); - DateTimeOffset furtureDate = lastModified.AddHours(1); + DateTimeOffset futureDate = lastModified.AddHours(1); HttpResponseMessage resp2 = await server .CreateRequest("/SubFolder/extra.xml") @@ -247,7 +247,7 @@ namespace Microsoft.AspNetCore.StaticFiles HttpResponseMessage resp4 = await server .CreateRequest("/SubFolder/extra.xml") .AddHeader("If-None-Match", "\"fake\"") - .And(req => req.Headers.IfModifiedSince = furtureDate) + .And(req => req.Headers.IfModifiedSince = futureDate) .SendAsync(method.Method); Assert.Equal(HttpStatusCode.OK, resp2.StatusCode); @@ -322,7 +322,7 @@ namespace Microsoft.AspNetCore.StaticFiles [Theory] [MemberData(nameof(SupportedMethods))] - public async Task SuppportsIfModifiedDateFormats(HttpMethod method) + public async Task SupportsIfModifiedDateFormats(HttpMethod method) { TestServer server = StaticFilesTestServer.Create(app => app.UseFileServer()); HttpResponseMessage res1 = await server diff --git a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/DefaultContentTypeProviderTests.cs b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/DefaultContentTypeProviderTests.cs index 1095b64350..5df588c802 100644 --- a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/DefaultContentTypeProviderTests.cs +++ b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/DefaultContentTypeProviderTests.cs @@ -16,11 +16,10 @@ namespace Microsoft.AspNetCore.StaticFiles } [Fact] - public void KnownExtensionsReturnTrye() + public void KnownExtensionsReturnType() { var provider = new FileExtensionContentTypeProvider(); - string contentType; - Assert.True(provider.TryGetContentType("known.txt", out contentType)); + Assert.True(provider.TryGetContentType("known.txt", out var contentType)); Assert.Equal("text/plain", contentType); } @@ -36,8 +35,7 @@ namespace Microsoft.AspNetCore.StaticFiles public void DashedExtensionsShouldBeMatched() { var provider = new FileExtensionContentTypeProvider(); - string contentType; - Assert.True(provider.TryGetContentType("known.dvr-ms", out contentType)); + Assert.True(provider.TryGetContentType("known.dvr-ms", out var contentType)); Assert.Equal("video/x-ms-dvr", contentType); } @@ -45,8 +43,7 @@ namespace Microsoft.AspNetCore.StaticFiles public void BothSlashFormatsAreUnderstood() { var provider = new FileExtensionContentTypeProvider(); - string contentType; - Assert.True(provider.TryGetContentType(@"/first/example.txt", out contentType)); + Assert.True(provider.TryGetContentType(@"/first/example.txt", out var contentType)); Assert.Equal("text/plain", contentType); Assert.True(provider.TryGetContentType(@"\second\example.txt", out contentType)); Assert.Equal("text/plain", contentType); @@ -56,8 +53,7 @@ namespace Microsoft.AspNetCore.StaticFiles public void DotsInDirectoryAreIgnored() { var provider = new FileExtensionContentTypeProvider(); - string contentType; - Assert.True(provider.TryGetContentType(@"/first.css/example.txt", out contentType)); + Assert.True(provider.TryGetContentType(@"/first.css/example.txt", out var contentType)); Assert.Equal("text/plain", contentType); Assert.True(provider.TryGetContentType(@"\second.css\example.txt", out contentType)); Assert.Equal("text/plain", contentType); diff --git a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/DefaultFilesMiddlewareTests.cs b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/DefaultFilesMiddlewareTests.cs index e50557f277..7df375d2d4 100644 --- a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/DefaultFilesMiddlewareTests.cs +++ b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/DefaultFilesMiddlewareTests.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; @@ -9,6 +9,7 @@ using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.TestHost; using Microsoft.AspNetCore.Testing.xunit; using Microsoft.Extensions.FileProviders; @@ -75,6 +76,8 @@ namespace Microsoft.AspNetCore.StaticFiles [InlineData("", @".", "/SubFolder/")] [InlineData("", @"./", "/SubFolder/")] [InlineData("", @"./SubFolder", "/")] + [InlineData("", @"./SubFolder", "/你好/")] + [InlineData("", @"./SubFolder", "/你好/世界/")] public async Task FoundDirectoryWithDefaultFile_PathModified_All(string baseUrl, string baseDir, string requestUrl) { await FoundDirectoryWithDefaultFile_PathModified(baseUrl, baseDir, requestUrl); @@ -85,6 +88,8 @@ namespace Microsoft.AspNetCore.StaticFiles [OSSkipCondition(OperatingSystems.MacOSX)] [InlineData("", @".\", "/SubFolder/")] [InlineData("", @".\subFolder", "/")] + [InlineData("", @".\SubFolder", "/你好/")] + [InlineData("", @".\SubFolder", "/你好/世界/")] public async Task FoundDirectoryWithDefaultFile_PathModified_Windows(string baseUrl, string baseDir, string requestUrl) { await FoundDirectoryWithDefaultFile_PathModified(baseUrl, baseDir, requestUrl); @@ -114,6 +119,8 @@ namespace Microsoft.AspNetCore.StaticFiles [InlineData("", @".", "/SubFolder", "")] [InlineData("", @"./", "/SubFolder", "")] [InlineData("", @"./", "/SubFolder", "?a=b")] + [InlineData("", @"./SubFolder", "/你好", "?a=b")] + [InlineData("", @"./SubFolder", "/你好/世界", "?a=b")] public async Task NearMatch_RedirectAddSlash_All(string baseUrl, string baseDir, string requestUrl, string queryString) { await NearMatch_RedirectAddSlash(baseUrl, baseDir, requestUrl, queryString); @@ -124,6 +131,8 @@ namespace Microsoft.AspNetCore.StaticFiles [OSSkipCondition(OperatingSystems.MacOSX)] [InlineData("", @".\", "/SubFolder", "")] [InlineData("", @".\", "/SubFolder", "?a=b")] + [InlineData("", @".\SubFolder", "/你好", "?a=b")] + [InlineData("", @".\SubFolder", "/你好/世界", "?a=b")] public async Task NearMatch_RedirectAddSlash_Windows(string baseUrl, string baseDir, string requestUrl, string queryString) { await NearMatch_RedirectAddSlash(baseUrl, baseDir, requestUrl, queryString); @@ -141,7 +150,10 @@ namespace Microsoft.AspNetCore.StaticFiles var response = await server.CreateRequest(requestUrl + queryString).GetAsync(); Assert.Equal(HttpStatusCode.Moved, response.StatusCode); - Assert.Equal(requestUrl + "/" + queryString, response.Headers.GetValues("Location").FirstOrDefault()); + // the url in the header of `Location: /xxx/xxx` should be encoded + var expectedURL = UriHelper.BuildRelative(baseUrl, requestUrl + "/", new QueryString(queryString), new FragmentString()); + var actualURL = response.Headers.GetValues("Location").FirstOrDefault(); + Assert.Equal(expectedURL, actualURL); Assert.Empty((await response.Content.ReadAsByteArrayAsync())); } } @@ -169,12 +181,12 @@ namespace Microsoft.AspNetCore.StaticFiles private async Task PostDirectory_PassesThrough(string baseUrl, string baseDir, string requestUrl) { - using (var fileProvder = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, baseDir))) + using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, baseDir))) { var server = StaticFilesTestServer.Create(app => app.UseDefaultFiles(new DefaultFilesOptions { RequestPath = new PathString(baseUrl), - FileProvider = fileProvder + FileProvider = fileProvider })); var response = await server.CreateRequest(requestUrl).GetAsync(); diff --git a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/StaticFileContextTest.cs b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/StaticFileContextTest.cs index a1da44fd38..f4fca87a36 100644 --- a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/StaticFileContextTest.cs +++ b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/StaticFileContextTest.cs @@ -70,8 +70,7 @@ namespace Microsoft.AspNetCore.StaticFiles public IFileInfo GetFileInfo(string subpath) { - IFileInfo result; - if (_files.TryGetValue(subpath, out result)) + if (_files.TryGetValue(subpath, out var result)) { return result; } diff --git a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/StaticFileMiddlewareTests.cs b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/StaticFileMiddlewareTests.cs index 31c6894d2b..2c5c30df63 100644 --- a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/StaticFileMiddlewareTests.cs +++ b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/StaticFileMiddlewareTests.cs @@ -101,9 +101,9 @@ namespace Microsoft.AspNetCore.StaticFiles var response = await server.CreateRequest("TestDocument.txt").GetAsync(); var last = fileInfo.LastModified; - var trimed = new DateTimeOffset(last.Year, last.Month, last.Day, last.Hour, last.Minute, last.Second, last.Offset).ToUniversalTime(); + var trimmed = new DateTimeOffset(last.Year, last.Month, last.Day, last.Hour, last.Minute, last.Second, last.Offset).ToUniversalTime(); - Assert.Equal(response.Content.Headers.LastModified.Value, trimed); + Assert.Equal(response.Content.Headers.LastModified.Value, trimmed); } } diff --git a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/SubFolder/你好/default.html b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/SubFolder/你好/default.html new file mode 100644 index 0000000000..4740d83682 --- /dev/null +++ b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/SubFolder/你好/default.html @@ -0,0 +1,11 @@ + + + + + + + + + Hello World + + \ No newline at end of file diff --git a/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/SubFolder/你好/世界/default.html b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/SubFolder/你好/世界/default.html new file mode 100644 index 0000000000..4740d83682 --- /dev/null +++ b/src/StaticFiles/test/Microsoft.AspNetCore.StaticFiles.Tests/SubFolder/你好/世界/default.html @@ -0,0 +1,11 @@ + + + + + + + + + Hello World + + \ No newline at end of file diff --git a/src/StaticFiles/version.props b/src/StaticFiles/version.props index 669c874829..4889a26987 100644 --- a/src/StaticFiles/version.props +++ b/src/StaticFiles/version.props @@ -1,6 +1,6 @@ - + - 2.1.1 + 2.2.0 rtm $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final