diff --git a/src/Microsoft.AspNet.StaticFiles/DefaultFilesExtensions.cs b/src/Microsoft.AspNet.StaticFiles/DefaultFilesExtensions.cs index 2f29be2..0ea6c3a 100644 --- a/src/Microsoft.AspNet.StaticFiles/DefaultFilesExtensions.cs +++ b/src/Microsoft.AspNet.StaticFiles/DefaultFilesExtensions.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using Microsoft.AspNet.Http; using Microsoft.AspNet.StaticFiles; @@ -17,7 +16,7 @@ public static class DefaultFilesExtensions /// /// /// - public static IApplicationBuilder UseDefaultFiles(this IApplicationBuilder builder) + public static IApplicationBuilder UseDefaultFiles([NotNull] this IApplicationBuilder builder) { return builder.UseDefaultFiles(new DefaultFilesOptions()); } @@ -28,9 +27,9 @@ public static IApplicationBuilder UseDefaultFiles(this IApplicationBuilder build /// /// The relative request path and physical path. /// - public static IApplicationBuilder UseDefaultFiles(this IApplicationBuilder builder, string requestPath) + public static IApplicationBuilder UseDefaultFiles([NotNull] this IApplicationBuilder builder, [NotNull] string requestPath) { - return UseDefaultFiles(builder, new DefaultFilesOptions() { RequestPath = new PathString(requestPath) }); + return builder.UseDefaultFiles(new DefaultFilesOptions() { RequestPath = new PathString(requestPath) }); } /// @@ -39,14 +38,9 @@ public static IApplicationBuilder UseDefaultFiles(this IApplicationBuilder build /// /// /// - public static IApplicationBuilder UseDefaultFiles(this IApplicationBuilder builder, DefaultFilesOptions options) + public static IApplicationBuilder UseDefaultFiles([NotNull] this IApplicationBuilder builder, [NotNull] DefaultFilesOptions options) { - if (builder == null) - { - throw new ArgumentNullException("builder"); - } - - return builder.Use(next => new DefaultFilesMiddleware(next, options).Invoke); + return builder.UseMiddleware(options); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.StaticFiles/DefaultFilesMiddleware.cs b/src/Microsoft.AspNet.StaticFiles/DefaultFilesMiddleware.cs index 96f6198..4cf577c 100644 --- a/src/Microsoft.AspNet.StaticFiles/DefaultFilesMiddleware.cs +++ b/src/Microsoft.AspNet.StaticFiles/DefaultFilesMiddleware.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.FileSystems; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.StaticFiles @@ -26,19 +27,11 @@ public class DefaultFilesMiddleware /// /// The next middleware in the pipeline. /// The configuration options for this middleware. - public DefaultFilesMiddleware(RequestDelegate next, DefaultFilesOptions options) + public DefaultFilesMiddleware([NotNull] RequestDelegate next, [NotNull] IHostingEnvironment hostingEnv, [NotNull] DefaultFilesOptions options) { - if (next == null) - { - throw new ArgumentNullException("next"); - } - if (options == null) - { - throw new ArgumentNullException("options"); - } if (options.FileSystem == null) { - options.FileSystem = new PhysicalFileSystem("." + options.RequestPath.Value); + options.FileSystem = new PhysicalFileSystem(Helpers.ResolveRootPath(hostingEnv.WebRoot, options.RequestPath)); } _next = next; diff --git a/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserExtensions.cs b/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserExtensions.cs index dbd83c0..fe32f39 100644 --- a/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserExtensions.cs +++ b/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserExtensions.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using Microsoft.AspNet.Http; using Microsoft.AspNet.StaticFiles; @@ -17,7 +16,7 @@ public static class DirectoryBrowserExtensions /// /// /// - public static IApplicationBuilder UseDirectoryBrowser(this IApplicationBuilder builder) + public static IApplicationBuilder UseDirectoryBrowser([NotNull] this IApplicationBuilder builder) { return builder.UseDirectoryBrowser(new DirectoryBrowserOptions()); } @@ -28,9 +27,9 @@ public static IApplicationBuilder UseDirectoryBrowser(this IApplicationBuilder b /// /// The relative request path and physical path. /// - public static IApplicationBuilder UseDirectoryBrowser(this IApplicationBuilder builder, string requestPath) + public static IApplicationBuilder UseDirectoryBrowser([NotNull] this IApplicationBuilder builder, [NotNull] string requestPath) { - return UseDirectoryBrowser(builder, new DirectoryBrowserOptions() { RequestPath = new PathString(requestPath) }); + return builder.UseDirectoryBrowser(new DirectoryBrowserOptions() { RequestPath = new PathString(requestPath) }); } /// @@ -39,14 +38,9 @@ public static IApplicationBuilder UseDirectoryBrowser(this IApplicationBuilder b /// /// /// - public static IApplicationBuilder UseDirectoryBrowser(this IApplicationBuilder builder, DirectoryBrowserOptions options) + public static IApplicationBuilder UseDirectoryBrowser([NotNull] this IApplicationBuilder builder, [NotNull] DirectoryBrowserOptions options) { - if (builder == null) - { - throw new ArgumentNullException("builder"); - } - - return builder.Use(next => new DirectoryBrowserMiddleware(next, options).Invoke); + return builder.UseMiddleware(options); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserMiddleware.cs b/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserMiddleware.cs index ba4b336..ba61682 100644 --- a/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserMiddleware.cs +++ b/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserMiddleware.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.FileSystems; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.StaticFiles @@ -24,23 +25,15 @@ public class DirectoryBrowserMiddleware /// /// The next middleware in the pipeline. /// The configuration for this middleware. - public DirectoryBrowserMiddleware(RequestDelegate next, DirectoryBrowserOptions options) + public DirectoryBrowserMiddleware([NotNull] RequestDelegate next, [NotNull] IHostingEnvironment hostingEnv, [NotNull] DirectoryBrowserOptions options) { - if (next == null) - { - throw new ArgumentNullException("next"); - } - if (options == null) - { - throw new ArgumentNullException("options"); - } if (options.Formatter == null) { throw new ArgumentException(Resources.Args_NoFormatter); } if (options.FileSystem == null) { - options.FileSystem = new PhysicalFileSystem("." + options.RequestPath.Value); + options.FileSystem = new PhysicalFileSystem(Helpers.ResolveRootPath(hostingEnv.WebRoot, options.RequestPath)); } _next = next; diff --git a/src/Microsoft.AspNet.StaticFiles/FileServerExtensions.cs b/src/Microsoft.AspNet.StaticFiles/FileServerExtensions.cs index d7fe812..9de67fc 100644 --- a/src/Microsoft.AspNet.StaticFiles/FileServerExtensions.cs +++ b/src/Microsoft.AspNet.StaticFiles/FileServerExtensions.cs @@ -18,9 +18,9 @@ public static class FileServerExtensions /// /// /// - public static IApplicationBuilder UseFileServer(this IApplicationBuilder builder) + public static IApplicationBuilder UseFileServer([NotNull] this IApplicationBuilder builder) { - return UseFileServer(builder, new FileServerOptions()); + return builder.UseFileServer(new FileServerOptions()); } /// @@ -29,9 +29,9 @@ public static IApplicationBuilder UseFileServer(this IApplicationBuilder builder /// /// Should directory browsing be enabled? /// - public static IApplicationBuilder UseFileServer(this IApplicationBuilder builder, bool enableDirectoryBrowsing) + public static IApplicationBuilder UseFileServer([NotNull] this IApplicationBuilder builder, bool enableDirectoryBrowsing) { - return UseFileServer(builder, new FileServerOptions() { EnableDirectoryBrowsing = enableDirectoryBrowsing }); + return builder.UseFileServer(new FileServerOptions() { EnableDirectoryBrowsing = enableDirectoryBrowsing }); } /// @@ -40,9 +40,9 @@ public static IApplicationBuilder UseFileServer(this IApplicationBuilder builder /// /// The relative request path and physical path. /// - public static IApplicationBuilder UseFileServer(this IApplicationBuilder builder, string requestPath) + public static IApplicationBuilder UseFileServer([NotNull] this IApplicationBuilder builder, [NotNull] string requestPath) { - return UseFileServer(builder, new FileServerOptions() { RequestPath = new PathString(requestPath) }); + return builder.UseFileServer(new FileServerOptions() { RequestPath = new PathString(requestPath) }); } /// @@ -51,7 +51,7 @@ public static IApplicationBuilder UseFileServer(this IApplicationBuilder builder /// /// /// - public static IApplicationBuilder UseFileServer(this IApplicationBuilder builder, FileServerOptions options) + public static IApplicationBuilder UseFileServer([NotNull] this IApplicationBuilder builder, [NotNull] FileServerOptions options) { if (options == null) { diff --git a/src/Microsoft.AspNet.StaticFiles/Helpers.cs b/src/Microsoft.AspNet.StaticFiles/Helpers.cs index eeb867b..efee663 100644 --- a/src/Microsoft.AspNet.StaticFiles/Helpers.cs +++ b/src/Microsoft.AspNet.StaticFiles/Helpers.cs @@ -3,6 +3,7 @@ using System; using System.Globalization; +using System.IO; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.StaticFiles @@ -49,5 +50,10 @@ internal static bool TryParseHttpDate(string dateString, out DateTime parsedDate { return DateTime.TryParseExact(dateString, Constants.HttpDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate); } + + internal static string ResolveRootPath(string webRoot, PathString path) + { + return Path.GetFullPath(Path.Combine(webRoot, path.Value ?? string.Empty)); + } } } diff --git a/src/Microsoft.AspNet.StaticFiles/IHostingEnvironment.cs b/src/Microsoft.AspNet.StaticFiles/IHostingEnvironment.cs new file mode 100644 index 0000000..d510d0b --- /dev/null +++ b/src/Microsoft.AspNet.StaticFiles/IHostingEnvironment.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Hosting +{ + [AssemblyNeutral] + public interface IHostingEnvironment + { + string EnvironmentName { get; } + + string WebRoot { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.StaticFiles/NotNullAttribute.cs b/src/Microsoft.AspNet.StaticFiles/NotNullAttribute.cs new file mode 100644 index 0000000..bc879f1 --- /dev/null +++ b/src/Microsoft.AspNet.StaticFiles/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.StaticFiles +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.StaticFiles/SendFileExtensions.cs b/src/Microsoft.AspNet.StaticFiles/SendFileExtensions.cs index 2248ea2..5ec72f4 100644 --- a/src/Microsoft.AspNet.StaticFiles/SendFileExtensions.cs +++ b/src/Microsoft.AspNet.StaticFiles/SendFileExtensions.cs @@ -17,13 +17,8 @@ public static class SendFileExtensions /// /// /// - public static IApplicationBuilder UseSendFileFallback(this IApplicationBuilder builder) + public static IApplicationBuilder UseSendFileFallback([NotNull] this IApplicationBuilder builder) { - if (builder == null) - { - throw new ArgumentNullException("builder"); - } - /* TODO builder.GetItem(typeof(ISendFile)) // Check for advertised support @@ -35,7 +30,7 @@ public static IApplicationBuilder UseSendFileFallback(this IApplicationBuilder b // Otherwise, insert a fallback SendFile middleware and advertise support SetSendFileCapability(builder.Properties); */ - return builder.Use(next => new SendFileMiddleware(next).Invoke); + return builder.UseMiddleware(); } private static bool IsSendFileSupported(IDictionary properties) diff --git a/src/Microsoft.AspNet.StaticFiles/SendFileMiddleware.cs b/src/Microsoft.AspNet.StaticFiles/SendFileMiddleware.cs index 92b15fc..8351dcd 100644 --- a/src/Microsoft.AspNet.StaticFiles/SendFileMiddleware.cs +++ b/src/Microsoft.AspNet.StaticFiles/SendFileMiddleware.cs @@ -25,13 +25,8 @@ public class SendFileMiddleware /// Creates a new instance of the SendFileMiddleware. /// /// The next middleware in the pipeline. - public SendFileMiddleware(RequestDelegate next) + public SendFileMiddleware([NotNull] RequestDelegate next) { - if (next == null) - { - throw new ArgumentNullException("next"); - } - _next = next; } diff --git a/src/Microsoft.AspNet.StaticFiles/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.StaticFiles/SendFileResponseExtensions.cs index 41edeae..8207505 100644 --- a/src/Microsoft.AspNet.StaticFiles/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.StaticFiles/SendFileResponseExtensions.cs @@ -19,12 +19,8 @@ public static class SendFileResponseExtensions /// /// /// True if sendfile.SendAsync is defined in the environment. - public static bool SupportsSendFile(this HttpResponse response) + public static bool SupportsSendFile([NotNull] this HttpResponse response) { - if (response == null) - { - throw new ArgumentNullException("response"); - } return response.HttpContext.GetFeature() != null; } @@ -34,12 +30,8 @@ public static bool SupportsSendFile(this HttpResponse response) /// /// /// - public static Task SendFileAsync(this HttpResponse response, string fileName) + public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName) { - if (response == null) - { - throw new ArgumentNullException("response"); - } return response.SendFileAsync(fileName, 0, null, CancellationToken.None); } @@ -52,12 +44,8 @@ public static Task SendFileAsync(this HttpResponse response, string fileName) /// The number of types to send, or null to send the remainder of the file. /// /// - public static Task SendFileAsync(this HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken) + public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName, long offset, long? count, CancellationToken cancellationToken) { - if (response == null) - { - throw new ArgumentNullException("response"); - } var sendFile = response.HttpContext.GetFeature(); if (sendFile == null) { diff --git a/src/Microsoft.AspNet.StaticFiles/StaticFileExtensions.cs b/src/Microsoft.AspNet.StaticFiles/StaticFileExtensions.cs index a514870..0a95e1f 100644 --- a/src/Microsoft.AspNet.StaticFiles/StaticFileExtensions.cs +++ b/src/Microsoft.AspNet.StaticFiles/StaticFileExtensions.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using Microsoft.AspNet.Http; using Microsoft.AspNet.StaticFiles; @@ -17,9 +16,9 @@ public static class StaticFileExtensions /// /// /// - public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder builder) + public static IApplicationBuilder UseStaticFiles([NotNull] this IApplicationBuilder builder) { - return UseStaticFiles(builder, new StaticFileOptions()); + return builder.UseStaticFiles(new StaticFileOptions()); } /// @@ -28,9 +27,9 @@ public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder builde /// /// The relative request path and physical path. /// - public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder builder, string requestPath) + public static IApplicationBuilder UseStaticFiles([NotNull] this IApplicationBuilder builder, [NotNull] string requestPath) { - return UseStaticFiles(builder, new StaticFileOptions() { RequestPath = new PathString(requestPath) }); + return builder.UseStaticFiles(new StaticFileOptions() { RequestPath = new PathString(requestPath) }); } /// @@ -39,13 +38,9 @@ public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder builde /// /// /// - public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder builder, StaticFileOptions options) + public static IApplicationBuilder UseStaticFiles([NotNull] this IApplicationBuilder builder, [NotNull] StaticFileOptions options) { - if (builder == null) - { - throw new ArgumentNullException("builder"); - } - return builder.Use(next => new StaticFileMiddleware(next, options).Invoke); + return builder.UseMiddleware(options); } } } diff --git a/src/Microsoft.AspNet.StaticFiles/StaticFileMiddleware.cs b/src/Microsoft.AspNet.StaticFiles/StaticFileMiddleware.cs index 7a9a3e8..e55ae49 100644 --- a/src/Microsoft.AspNet.StaticFiles/StaticFileMiddleware.cs +++ b/src/Microsoft.AspNet.StaticFiles/StaticFileMiddleware.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.FileSystems; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.StaticFiles @@ -23,23 +24,15 @@ public class StaticFileMiddleware /// /// The next middleware in the pipeline. /// The configuration options. - public StaticFileMiddleware(RequestDelegate next, StaticFileOptions options) + public StaticFileMiddleware([NotNull] RequestDelegate next, [NotNull] IHostingEnvironment hostingEnv, [NotNull] StaticFileOptions options) { - if (next == null) - { - throw new ArgumentNullException("next"); - } - if (options == null) - { - throw new ArgumentNullException("options"); - } if (options.ContentTypeProvider == null) { throw new ArgumentException(Resources.Args_NoContentTypeProvider); } if (options.FileSystem == null) { - options.FileSystem = new PhysicalFileSystem("." + options.RequestPath.Value); + options.FileSystem = new PhysicalFileSystem(Helpers.ResolveRootPath(hostingEnv.WebRoot, options.RequestPath)); } _next = next; diff --git a/src/Microsoft.AspNet.StaticFiles/project.json b/src/Microsoft.AspNet.StaticFiles/project.json index 5ad8ca2..be56a85 100644 --- a/src/Microsoft.AspNet.StaticFiles/project.json +++ b/src/Microsoft.AspNet.StaticFiles/project.json @@ -3,7 +3,8 @@ "dependencies": { "Microsoft.AspNet.FileSystems": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*" + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.RequestContainer": "1.0.0-*" }, "frameworks": { "aspnet50": {}, diff --git a/test/Microsoft.AspNet.StaticFiles.Tests/DefaultFilesMiddlewareTests.cs b/test/Microsoft.AspNet.StaticFiles.Tests/DefaultFilesMiddlewareTests.cs index 5cd549d..bc41dfb 100644 --- a/test/Microsoft.AspNet.StaticFiles.Tests/DefaultFilesMiddlewareTests.cs +++ b/test/Microsoft.AspNet.StaticFiles.Tests/DefaultFilesMiddlewareTests.cs @@ -20,8 +20,6 @@ public class DefaultFilesMiddlewareTests [Fact] public async Task NullArguments() { - Assert.Throws(() => TestServer.Create(app => app.UseDefaultFiles((DefaultFilesOptions)null))); - // No exception, default provided TestServer.Create(app => app.UseDefaultFiles(new DefaultFilesOptions() { FileSystem = null })); @@ -32,11 +30,11 @@ public async Task NullArguments() } [Theory] - [InlineData("", @"", "/missing.dir")] + [InlineData("", @".", "/missing.dir")] [InlineData("", @".", "/missing.dir/")] [InlineData("/subdir", @".", "/subdir/missing.dir")] - [InlineData("/subdir", @"", "/subdir/missing.dir/")] - [InlineData("", @"\", "/missing.dir")] + [InlineData("/subdir", @".", "/subdir/missing.dir/")] + [InlineData("", @".\", "/missing.dir")] public async Task NoMatch_PassesThrough(string baseUrl, string baseDir, string requestUrl) { TestServer server = TestServer.Create(app => @@ -44,7 +42,7 @@ public async Task NoMatch_PassesThrough(string baseUrl, string baseDir, string r app.UseDefaultFiles(new DefaultFilesOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) }); app.Run(context => context.Response.WriteAsync(context.Request.Path.Value)); }); @@ -55,10 +53,8 @@ public async Task NoMatch_PassesThrough(string baseUrl, string baseDir, string r } [Theory] - [InlineData("", @"", "/SubFolder/")] [InlineData("", @".", "/SubFolder/")] [InlineData("", @".\", "/SubFolder/")] - [InlineData("", @"SubFolder", "/")] [InlineData("", @".\SubFolder", "/")] public async Task FoundDirectoryWithDefaultFile_PathModified(string baseUrl, string baseDir, string requestUrl) { @@ -67,7 +63,7 @@ public async Task FoundDirectoryWithDefaultFile_PathModified(string baseUrl, str app.UseDefaultFiles(new DefaultFilesOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) }); app.Run(context => context.Response.WriteAsync(context.Request.Path.Value)); }); @@ -78,18 +74,15 @@ public async Task FoundDirectoryWithDefaultFile_PathModified(string baseUrl, str } [Theory] - [InlineData("", @"", "/SubFolder", "")] [InlineData("", @".", "/SubFolder", "")] [InlineData("", @".\", "/SubFolder", "")] [InlineData("", @".\", "/SubFolder", "?a=b")] - [InlineData("", @".\", "/SubFolder", "?a=b")] - [InlineData("", @".\", "/SubFolder", "?a=b")] public async Task NearMatch_RedirectAddSlash(string baseUrl, string baseDir, string requestUrl, string queryString) { TestServer server = TestServer.Create(app => app.UseDefaultFiles(new DefaultFilesOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl + queryString).GetAsync(); @@ -99,8 +92,8 @@ public async Task NearMatch_RedirectAddSlash(string baseUrl, string baseDir, str } [Theory] - [InlineData("/SubFolder", @"\", "/SubFolder/")] - [InlineData("/SubFolder", @"", "/somedir/")] + [InlineData("/SubFolder", @".\", "/SubFolder/")] + [InlineData("/SubFolder", @".", "/somedir/")] [InlineData("", @".\SubFolder", "/")] [InlineData("", @".\SubFolder\", "/")] public async Task PostDirectory_PassesThrough(string baseUrl, string baseDir, string requestUrl) @@ -108,7 +101,7 @@ public async Task PostDirectory_PassesThrough(string baseUrl, string baseDir, st TestServer server = TestServer.Create(app => app.UseDefaultFiles(new DefaultFilesOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl).GetAsync(); diff --git a/test/Microsoft.AspNet.StaticFiles.Tests/DirectoryBrowserMiddlewareTests.cs b/test/Microsoft.AspNet.StaticFiles.Tests/DirectoryBrowserMiddlewareTests.cs index 7704280..4f6888b 100644 --- a/test/Microsoft.AspNet.StaticFiles.Tests/DirectoryBrowserMiddlewareTests.cs +++ b/test/Microsoft.AspNet.StaticFiles.Tests/DirectoryBrowserMiddlewareTests.cs @@ -1,8 +1,10 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. using System; +using System.IO; using System.Net; using System.Net.Http; +using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.FileSystems; @@ -17,8 +19,7 @@ public class DirectoryBrowserMiddlewareTests [Fact] public async Task NullArguments() { - Assert.Throws(() => TestServer.Create(app => app.UseDirectoryBrowser((DirectoryBrowserOptions)null))); - Assert.Throws(() => TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { Formatter = null }))); + Assert.Throws(() => TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { Formatter = null }))); // No exception, default provided TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { FileSystem = null })); @@ -30,36 +31,34 @@ public async Task NullArguments() } [Theory] - [InlineData("", @"", "/missing.dir")] + [InlineData("", @".", "/missing.dir")] [InlineData("", @".", "/missing.dir/")] [InlineData("/subdir", @".", "/subdir/missing.dir")] - [InlineData("/subdir", @"", "/subdir/missing.dir/")] - [InlineData("", @"\", "/missing.dir")] + [InlineData("/subdir", @".", "/subdir/missing.dir/")] + [InlineData("", @".\", "/missing.dir")] public async Task NoMatch_PassesThrough(string baseUrl, string baseDir, string requestUrl) { TestServer server = TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl).GetAsync(); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } [Theory] - [InlineData("", @"", "/")] [InlineData("", @".", "/")] - [InlineData("", @"", "/SubFolder/")] [InlineData("", @".", "/SubFolder/")] - [InlineData("/somedir", @"", "/somedir/")] - [InlineData("/somedir", @"\", "/somedir/")] + [InlineData("/somedir", @".", "/somedir/")] + [InlineData("/somedir", @".\", "/somedir/")] [InlineData("/somedir", @".", "/somedir/subfolder/")] public async Task FoundDirectory_Served(string baseUrl, string baseDir, string requestUrl) { TestServer server = TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl).GetAsync(); @@ -70,20 +69,18 @@ public async Task FoundDirectory_Served(string baseUrl, string baseDir, string r } [Theory] - [InlineData("", @"", "/SubFolder", "")] [InlineData("", @".", "/SubFolder", "")] - [InlineData("/somedir", @"", "/somedir", "")] + [InlineData("/somedir", @".", "/somedir", "")] [InlineData("/somedir", @".", "/somedir/subfolder", "")] - [InlineData("", @"", "/SubFolder", "?a=b")] [InlineData("", @".", "/SubFolder", "?a=b")] - [InlineData("/somedir", @"", "/somedir", "?a=b")] + [InlineData("/somedir", @".", "/somedir", "?a=b")] [InlineData("/somedir", @".", "/somedir/subfolder", "?a=b")] public async Task NearMatch_RedirectAddSlash(string baseUrl, string baseDir, string requestUrl, string queryString) { TestServer server = TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl + queryString).GetAsync(); @@ -93,36 +90,32 @@ public async Task NearMatch_RedirectAddSlash(string baseUrl, string baseDir, str } [Theory] - [InlineData("", @"", "/")] [InlineData("", @".", "/")] - [InlineData("", @"", "/SubFolder/")] [InlineData("", @".", "/SubFolder/")] - [InlineData("/somedir", @"", "/somedir/")] + [InlineData("/somedir", @".", "/somedir/")] [InlineData("/somedir", @".", "/somedir/subfolder/")] public async Task PostDirectory_PassesThrough(string baseUrl, string baseDir, string requestUrl) { TestServer server = TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl).PostAsync(); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } [Theory] - [InlineData("", @"", "/")] [InlineData("", @".", "/")] - [InlineData("", @"", "/SubFolder/")] [InlineData("", @".", "/SubFolder/")] - [InlineData("/somedir", @"", "/somedir/")] + [InlineData("/somedir", @".", "/somedir/")] [InlineData("/somedir", @".", "/somedir/subfolder/")] public async Task HeadDirectory_HeadersButNotBodyServed(string baseUrl, string baseDir, string requestUrl) { TestServer server = TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl).SendAsync("HEAD"); diff --git a/test/Microsoft.AspNet.StaticFiles.Tests/StaticFileMiddlewareTests.cs b/test/Microsoft.AspNet.StaticFiles.Tests/StaticFileMiddlewareTests.cs index 1983b43..51f7546 100644 --- a/test/Microsoft.AspNet.StaticFiles.Tests/StaticFileMiddlewareTests.cs +++ b/test/Microsoft.AspNet.StaticFiles.Tests/StaticFileMiddlewareTests.cs @@ -4,6 +4,7 @@ using System.IO; using System.Net; using System.Net.Http; +using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.FileSystems; @@ -18,8 +19,7 @@ public class StaticFileMiddlewareTests [Fact] public async Task NullArguments() { - Assert.Throws(() => TestServer.Create(app => app.UseStaticFiles((StaticFileOptions)null))); - Assert.Throws(() => TestServer.Create(app => app.UseStaticFiles(new StaticFileOptions() { ContentTypeProvider = null }))); + Assert.Throws(() => TestServer.Create(app => app.UseStaticFiles(new StaticFileOptions() { ContentTypeProvider = null }))); // No exception, default provided TestServer.Create(app => app.UseStaticFiles(new StaticFileOptions() { FileSystem = null })); @@ -33,20 +33,20 @@ public async Task NullArguments() [Fact] public void GivenDirDoesntExist_Throw() { - Assert.Throws(() => TestServer.Create(app => app.UseStaticFiles("/ThisDirDoesntExist"))); + Assert.Throws(() => TestServer.Create(app => app.UseStaticFiles("/ThisDirDoesntExist"))); } [Theory] [InlineData("", @".", "/missing.file")] [InlineData("/subdir", @".", "/subdir/missing.file")] - [InlineData("/missing.file", @"\", "/missing.file")] - [InlineData("", @"\", "/xunit.xml")] + [InlineData("/missing.file", @".\", "/missing.file")] + [InlineData("", @".\", "/xunit.xml")] public async Task NoMatch_PassesThrough(string baseUrl, string baseDir, string requestUrl) { TestServer server = TestServer.Create(app => app.UseStaticFiles(new StaticFileOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl).GetAsync(); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); @@ -64,7 +64,7 @@ public async Task FoundFile_Served(string baseUrl, string baseDir, string reques TestServer server = TestServer.Create(app => app.UseStaticFiles(new StaticFileOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl).GetAsync(); @@ -86,7 +86,7 @@ public async Task PostFile_PassesThrough(string baseUrl, string baseDir, string TestServer server = TestServer.Create(app => app.UseStaticFiles(new StaticFileOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl).PostAsync(); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); @@ -104,7 +104,7 @@ public async Task HeadFile_HeadersButNotBodyServed(string baseUrl, string baseDi TestServer server = TestServer.Create(app => app.UseStaticFiles(new StaticFileOptions() { RequestPath = new PathString(baseUrl), - FileSystem = new PhysicalFileSystem(baseDir) + FileSystem = new PhysicalFileSystem(Path.Combine(Environment.CurrentDirectory, baseDir)) })); HttpResponseMessage response = await server.CreateRequest(requestUrl).SendAsync("HEAD");