|
|
@@ -56,9 +56,14 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
[InlineData("/subdir", @".", "/subdir/missing.dir")]
|
|
|
[InlineData("/subdir", @".", "/subdir/missing.dir/")]
|
|
|
[InlineData("", @"./", "/missing.dir")]
|
|
|
- public async Task NoMatch_PassesThrough_All(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ [InlineData("", @".", "/missing.dir", false)]
|
|
|
+ [InlineData("", @".", "/missing.dir/", false)]
|
|
|
+ [InlineData("/subdir", @".", "/subdir/missing.dir", false)]
|
|
|
+ [InlineData("/subdir", @".", "/subdir/missing.dir/", false)]
|
|
|
+ [InlineData("", @"./", "/missing.dir", false)]
|
|
|
+ public async Task NoMatch_PassesThrough_All(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
- await NoMatch_PassesThrough(baseUrl, baseDir, requestUrl);
|
|
|
+ await NoMatch_PassesThrough(baseUrl, baseDir, requestUrl, appendTrailingSlash);
|
|
|
}
|
|
|
|
|
|
[ConditionalTheory]
|
|
|
@@ -66,12 +71,14 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
[OSSkipCondition(OperatingSystems.MacOSX)]
|
|
|
[InlineData("", @".\", "/missing.dir")]
|
|
|
[InlineData("", @".\", "/Missing.dir")]
|
|
|
- public async Task NoMatch_PassesThrough_Windows(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ [InlineData("", @".\", "/missing.dir", false)]
|
|
|
+ [InlineData("", @".\", "/Missing.dir", false)]
|
|
|
+ public async Task NoMatch_PassesThrough_Windows(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
- await NoMatch_PassesThrough(baseUrl, baseDir, requestUrl);
|
|
|
+ await NoMatch_PassesThrough(baseUrl, baseDir, requestUrl, appendTrailingSlash);
|
|
|
}
|
|
|
|
|
|
- private async Task NoMatch_PassesThrough(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ private async Task NoMatch_PassesThrough(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, baseDir)))
|
|
|
{
|
|
|
@@ -79,7 +86,8 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
app => app.UseDirectoryBrowser(new DirectoryBrowserOptions
|
|
|
{
|
|
|
RequestPath = new PathString(baseUrl),
|
|
|
- FileProvider = fileProvider
|
|
|
+ FileProvider = fileProvider,
|
|
|
+ RedirectToAppendTrailingSlash = appendTrailingSlash
|
|
|
}),
|
|
|
services => services.AddDirectoryBrowser());
|
|
|
var response = await server.CreateRequest(requestUrl).GetAsync();
|
|
|
@@ -117,7 +125,7 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
FileProvider = fileProvider
|
|
|
});
|
|
|
|
|
|
- app.UseEndpoints(endpoints => {});
|
|
|
+ app.UseEndpoints(endpoints => { });
|
|
|
},
|
|
|
services => { services.AddDirectoryBrowser(); services.AddRouting(); });
|
|
|
|
|
|
@@ -133,9 +141,19 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
[InlineData("/somedir", @".", "/somedir/")]
|
|
|
[InlineData("/somedir", @"./", "/somedir/")]
|
|
|
[InlineData("/somedir", @".", "/somedir/SubFolder/")]
|
|
|
- public async Task FoundDirectory_Served_All(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ [InlineData("", @".", "/", false)]
|
|
|
+ [InlineData("", @".", "/SubFolder/", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/", false)]
|
|
|
+ [InlineData("/somedir", @"./", "/somedir/", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/SubFolder/", false)]
|
|
|
+ [InlineData("", @".", "", false)]
|
|
|
+ [InlineData("", @".", "/SubFolder", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir", false)]
|
|
|
+ [InlineData("/somedir", @"./", "/somedir", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/SubFolder", false)]
|
|
|
+ public async Task FoundDirectory_Served_All(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
- await FoundDirectory_Served(baseUrl, baseDir, requestUrl);
|
|
|
+ await FoundDirectory_Served(baseUrl, baseDir, requestUrl, appendTrailingSlash);
|
|
|
}
|
|
|
|
|
|
[ConditionalTheory]
|
|
|
@@ -143,12 +161,16 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
[OSSkipCondition(OperatingSystems.MacOSX)]
|
|
|
[InlineData("/somedir", @".\", "/somedir/")]
|
|
|
[InlineData("/somedir", @".", "/somedir/subFolder/")]
|
|
|
- public async Task FoundDirectory_Served_Windows(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ [InlineData("/somedir", @".\", "/somedir/", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/subFolder/", false)]
|
|
|
+ [InlineData("/somedir", @".\", "/somedir", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/subFolder", false)]
|
|
|
+ public async Task FoundDirectory_Served_Windows(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
- await FoundDirectory_Served(baseUrl, baseDir, requestUrl);
|
|
|
+ await FoundDirectory_Served(baseUrl, baseDir, requestUrl, appendTrailingSlash);
|
|
|
}
|
|
|
|
|
|
- private async Task FoundDirectory_Served(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ private async Task FoundDirectory_Served(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, baseDir)))
|
|
|
{
|
|
|
@@ -156,7 +178,8 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
app => app.UseDirectoryBrowser(new DirectoryBrowserOptions
|
|
|
{
|
|
|
RequestPath = new PathString(baseUrl),
|
|
|
- FileProvider = fileProvider
|
|
|
+ FileProvider = fileProvider,
|
|
|
+ RedirectToAppendTrailingSlash = appendTrailingSlash,
|
|
|
}),
|
|
|
services => services.AddDirectoryBrowser());
|
|
|
var response = await server.CreateRequest(requestUrl).GetAsync();
|
|
|
@@ -215,21 +238,31 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
[InlineData("", @".", "/SubFolder/")]
|
|
|
[InlineData("/somedir", @".", "/somedir/")]
|
|
|
[InlineData("/somedir", @".", "/somedir/SubFolder/")]
|
|
|
- public async Task PostDirectory_PassesThrough_All(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ [InlineData("", @".", "/", false)]
|
|
|
+ [InlineData("", @".", "/SubFolder/", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/SubFolder/", false)]
|
|
|
+ [InlineData("", @".", "", false)]
|
|
|
+ [InlineData("", @".", "/SubFolder", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/SubFolder", false)]
|
|
|
+ public async Task PostDirectory_PassesThrough_All(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
- await PostDirectory_PassesThrough(baseUrl, baseDir, requestUrl);
|
|
|
+ await PostDirectory_PassesThrough(baseUrl, baseDir, requestUrl, appendTrailingSlash);
|
|
|
}
|
|
|
|
|
|
[ConditionalTheory]
|
|
|
[OSSkipCondition(OperatingSystems.Linux)]
|
|
|
[OSSkipCondition(OperatingSystems.MacOSX)]
|
|
|
[InlineData("/somedir", @".", "/somedir/subFolder/")]
|
|
|
- public async Task PostDirectory_PassesThrough_Windows(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ [InlineData("/somedir", @".", "/somedir/subFolder/", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/subFolder", false)]
|
|
|
+ public async Task PostDirectory_PassesThrough_Windows(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
- await PostDirectory_PassesThrough(baseUrl, baseDir, requestUrl);
|
|
|
+ await PostDirectory_PassesThrough(baseUrl, baseDir, requestUrl, appendTrailingSlash);
|
|
|
}
|
|
|
|
|
|
- private async Task PostDirectory_PassesThrough(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ private async Task PostDirectory_PassesThrough(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, baseDir)))
|
|
|
{
|
|
|
@@ -237,7 +270,8 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
app => app.UseDirectoryBrowser(new DirectoryBrowserOptions
|
|
|
{
|
|
|
RequestPath = new PathString(baseUrl),
|
|
|
- FileProvider = fileProvider
|
|
|
+ FileProvider = fileProvider,
|
|
|
+ RedirectToAppendTrailingSlash = appendTrailingSlash
|
|
|
}),
|
|
|
services => services.AddDirectoryBrowser());
|
|
|
|
|
|
@@ -251,21 +285,31 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
[InlineData("", @".", "/SubFolder/")]
|
|
|
[InlineData("/somedir", @".", "/somedir/")]
|
|
|
[InlineData("/somedir", @".", "/somedir/SubFolder/")]
|
|
|
- public async Task HeadDirectory_HeadersButNotBodyServed_All(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ [InlineData("", @".", "/", false)]
|
|
|
+ [InlineData("", @".", "/SubFolder/", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/SubFolder/", false)]
|
|
|
+ [InlineData("", @".", "", false)]
|
|
|
+ [InlineData("", @".", "/SubFolder", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/SubFolder", false)]
|
|
|
+ public async Task HeadDirectory_HeadersButNotBodyServed_All(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
- await HeadDirectory_HeadersButNotBodyServed(baseUrl, baseDir, requestUrl);
|
|
|
+ await HeadDirectory_HeadersButNotBodyServed(baseUrl, baseDir, requestUrl, appendTrailingSlash);
|
|
|
}
|
|
|
|
|
|
[ConditionalTheory]
|
|
|
[OSSkipCondition(OperatingSystems.Linux)]
|
|
|
[OSSkipCondition(OperatingSystems.MacOSX)]
|
|
|
[InlineData("/somedir", @".", "/somedir/subFolder/")]
|
|
|
- public async Task HeadDirectory_HeadersButNotBodyServed_Windows(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ [InlineData("/somedir", @".", "/somedir/subFolder/", false)]
|
|
|
+ [InlineData("/somedir", @".", "/somedir/subFolder", false)]
|
|
|
+ public async Task HeadDirectory_HeadersButNotBodyServed_Windows(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
- await HeadDirectory_HeadersButNotBodyServed(baseUrl, baseDir, requestUrl);
|
|
|
+ await HeadDirectory_HeadersButNotBodyServed(baseUrl, baseDir, requestUrl, appendTrailingSlash);
|
|
|
}
|
|
|
|
|
|
- private async Task HeadDirectory_HeadersButNotBodyServed(string baseUrl, string baseDir, string requestUrl)
|
|
|
+ private async Task HeadDirectory_HeadersButNotBodyServed(string baseUrl, string baseDir, string requestUrl, bool appendTrailingSlash = true)
|
|
|
{
|
|
|
using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, baseDir)))
|
|
|
{
|
|
|
@@ -273,7 +317,8 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
app => app.UseDirectoryBrowser(new DirectoryBrowserOptions
|
|
|
{
|
|
|
RequestPath = new PathString(baseUrl),
|
|
|
- FileProvider = fileProvider
|
|
|
+ FileProvider = fileProvider,
|
|
|
+ RedirectToAppendTrailingSlash = appendTrailingSlash
|
|
|
}),
|
|
|
services => services.AddDirectoryBrowser());
|
|
|
|
|
|
@@ -285,5 +330,11 @@ namespace Microsoft.AspNetCore.StaticFiles
|
|
|
Assert.Empty((await response.Content.ReadAsByteArrayAsync()));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void Options_AppendTrailingSlashByDefault()
|
|
|
+ {
|
|
|
+ Assert.True(new DirectoryBrowserOptions().RedirectToAppendTrailingSlash);
|
|
|
+ }
|
|
|
}
|
|
|
}
|