diff --git a/samples/StaticFileSample/Startup.cs b/samples/StaticFileSample/Startup.cs index f34cd5a14f..164c1d65f1 100644 --- a/samples/StaticFileSample/Startup.cs +++ b/samples/StaticFileSample/Startup.cs @@ -1,6 +1,6 @@ using Microsoft.AspNet.Builder; -using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.StaticFiles; +using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; using Microsoft.Framework.Logging.Console; @@ -8,11 +8,18 @@ namespace StaticFilesSample { public class Startup { + public void ConfigureServices(IServiceCollection services) + { + services.AddDirectoryBrowser(); + } + public void Configure(IApplicationBuilder app, ILoggerFactory factory) { // Displays all log levels factory.AddConsole(LogLevel.Verbose); + app.UseRequestServices(); + app.UseFileServer(new FileServerOptions() { EnableDirectoryBrowsing = true, diff --git a/samples/StaticFileSample/project.json b/samples/StaticFileSample/project.json index a0f2cf42d2..47d2733df8 100644 --- a/samples/StaticFileSample/project.json +++ b/samples/StaticFileSample/project.json @@ -4,14 +4,15 @@ }, "dependencies": { "Kestrel": "1.0.0-*", + "Microsoft.AspNet.RequestContainer": "1.0.0-*", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", "Microsoft.AspNet.StaticFiles": "1.0.0-*", "Microsoft.Framework.Logging.Console": "1.0.0-*" }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { } + "aspnet50": {}, + "aspnetcore50": {} }, "webroot": "wwwroot" -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserMiddleware.cs b/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserMiddleware.cs index 45fd61764f..589a4d912f 100644 --- a/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserMiddleware.cs +++ b/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserMiddleware.cs @@ -73,4 +73,4 @@ namespace Microsoft.AspNet.StaticFiles return contents.Exists; } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserServiceExtensions.cs b/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserServiceExtensions.cs new file mode 100644 index 0000000000..1ef44955ec --- /dev/null +++ b/src/Microsoft.AspNet.StaticFiles/DirectoryBrowserServiceExtensions.cs @@ -0,0 +1,35 @@ +// 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.AspNet.StaticFiles; +using Microsoft.Framework.ConfigurationModel; + +namespace Microsoft.Framework.DependencyInjection +{ + /// + /// Extension methods for adding directory browser services. + /// + public static class DirectoryBrowserServiceExtensions + { + /// + /// Adds directory browser middleware services. + /// + /// + /// + public static IServiceCollection AddDirectoryBrowser([NotNull] this IServiceCollection services) + { + return services.AddDirectoryBrowser(configuration: null); + } + + /// + /// Adds directory browser middleware services. + /// + /// + /// + /// + public static IServiceCollection AddDirectoryBrowser([NotNull] this IServiceCollection services, IConfiguration configuration) + { + return services.AddEncoders(configuration); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.StaticFiles/HtmlDirectoryFormatter.cs b/src/Microsoft.AspNet.StaticFiles/HtmlDirectoryFormatter.cs index 09803b93d3..952c4ae0c1 100644 --- a/src/Microsoft.AspNet.StaticFiles/HtmlDirectoryFormatter.cs +++ b/src/Microsoft.AspNet.StaticFiles/HtmlDirectoryFormatter.cs @@ -5,11 +5,11 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Net; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.Http; +using Microsoft.AspNet.WebUtilities.Encoders; namespace Microsoft.AspNet.StaticFiles { @@ -20,6 +20,8 @@ namespace Microsoft.AspNet.StaticFiles { private const string TextHtmlUtf8 = "text/html; charset=utf-8"; + private static IHtmlEncoder _htmlEncoder; + /// /// Generates an HTML view for a directory. /// @@ -34,6 +36,11 @@ namespace Microsoft.AspNet.StaticFiles throw new ArgumentNullException("contents"); } + if (_htmlEncoder == null) + { + _htmlEncoder = context.ApplicationServices.GetHtmlEncoder(); + } + context.Response.ContentType = TextHtmlUtf8; if (Helpers.IsHeadMethod(context.Request.Method)) @@ -154,7 +161,7 @@ namespace Microsoft.AspNet.StaticFiles private static string HtmlEncode(string body) { - return WebUtility.HtmlEncode(body); + return _htmlEncoder.HtmlEncode(body); } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.StaticFiles/IDirectoryFormatter.cs b/src/Microsoft.AspNet.StaticFiles/IDirectoryFormatter.cs index c30bdb9dc3..932429d7cd 100644 --- a/src/Microsoft.AspNet.StaticFiles/IDirectoryFormatter.cs +++ b/src/Microsoft.AspNet.StaticFiles/IDirectoryFormatter.cs @@ -20,4 +20,4 @@ namespace Microsoft.AspNet.StaticFiles /// Task GenerateContentAsync(HttpContext context, IEnumerable contents); } -} +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.StaticFiles.Tests/DirectoryBrowserMiddlewareTests.cs b/test/Microsoft.AspNet.StaticFiles.Tests/DirectoryBrowserMiddlewareTests.cs index eede055611..aabe00c534 100644 --- a/test/Microsoft.AspNet.StaticFiles.Tests/DirectoryBrowserMiddlewareTests.cs +++ b/test/Microsoft.AspNet.StaticFiles.Tests/DirectoryBrowserMiddlewareTests.cs @@ -4,12 +4,12 @@ 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.FileProviders; using Microsoft.AspNet.Http; using Microsoft.AspNet.TestHost; +using Microsoft.Framework.DependencyInjection; using Xunit; namespace Microsoft.AspNet.StaticFiles @@ -19,13 +19,29 @@ namespace Microsoft.AspNet.StaticFiles [Fact] public async Task NullArguments() { - Assert.Throws(() => TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { Formatter = null }))); + Assert.Throws(() => TestServer.Create(app => + { + app.UseServices(services => services.AddDirectoryBrowser()); + + app.UseDirectoryBrowser(new DirectoryBrowserOptions() { Formatter = null }); + })); // No exception, default provided - TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() { FileProvider = null })); + TestServer.Create(app => + { + app.UseServices(services => services.AddDirectoryBrowser()); + + app.UseDirectoryBrowser(new DirectoryBrowserOptions() { FileProvider = null }); + }); // PathString(null) is OK. - TestServer server = TestServer.Create(app => app.UseDirectoryBrowser((string)null)); + TestServer server = TestServer.Create(app => + { + app.UseServices(services => services.AddDirectoryBrowser()); + + app.UseDirectoryBrowser((string)null); + }); + var response = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); } @@ -38,11 +54,16 @@ namespace Microsoft.AspNet.StaticFiles [InlineData("", @".\", "/missing.dir")] public async Task NoMatch_PassesThrough(string baseUrl, string baseDir, string requestUrl) { - TestServer server = TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() + TestServer server = TestServer.Create(app => { - RequestPath = new PathString(baseUrl), - FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) - })); + app.UseServices(services => services.AddDirectoryBrowser()); + + app.UseDirectoryBrowser(new DirectoryBrowserOptions() + { + RequestPath = new PathString(baseUrl), + FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) + }); + }); HttpResponseMessage response = await server.CreateRequest(requestUrl).GetAsync(); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } @@ -55,11 +76,16 @@ namespace Microsoft.AspNet.StaticFiles [InlineData("/somedir", @".", "/somedir/subfolder/")] public async Task FoundDirectory_Served(string baseUrl, string baseDir, string requestUrl) { - TestServer server = TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() + TestServer server = TestServer.Create(app => { - RequestPath = new PathString(baseUrl), - FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) - })); + app.UseServices(services => services.AddDirectoryBrowser()); + + app.UseDirectoryBrowser(new DirectoryBrowserOptions() + { + RequestPath = new PathString(baseUrl), + FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) + }); + }); HttpResponseMessage response = await server.CreateRequest(requestUrl).GetAsync(); Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -77,11 +103,17 @@ namespace Microsoft.AspNet.StaticFiles [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() + TestServer server = TestServer.Create(app => { - RequestPath = new PathString(baseUrl), - FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) - })); + app.UseServices(services => services.AddDirectoryBrowser()); + + app.UseDirectoryBrowser(new DirectoryBrowserOptions() + { + RequestPath = new PathString(baseUrl), + FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) + }); + }); + HttpResponseMessage response = await server.CreateRequest(requestUrl + queryString).GetAsync(); Assert.Equal(HttpStatusCode.Moved, response.StatusCode); @@ -96,11 +128,17 @@ namespace Microsoft.AspNet.StaticFiles [InlineData("/somedir", @".", "/somedir/subfolder/")] public async Task PostDirectory_PassesThrough(string baseUrl, string baseDir, string requestUrl) { - TestServer server = TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() + TestServer server = TestServer.Create(app => { - RequestPath = new PathString(baseUrl), - FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) - })); + app.UseServices(services => services.AddDirectoryBrowser()); + + app.UseDirectoryBrowser(new DirectoryBrowserOptions() + { + RequestPath = new PathString(baseUrl), + FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) + }); + }); + HttpResponseMessage response = await server.CreateRequest(requestUrl).PostAsync(); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } @@ -112,11 +150,17 @@ namespace Microsoft.AspNet.StaticFiles [InlineData("/somedir", @".", "/somedir/subfolder/")] public async Task HeadDirectory_HeadersButNotBodyServed(string baseUrl, string baseDir, string requestUrl) { - TestServer server = TestServer.Create(app => app.UseDirectoryBrowser(new DirectoryBrowserOptions() + TestServer server = TestServer.Create(app => { - RequestPath = new PathString(baseUrl), - FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) - })); + app.UseServices(services => services.AddDirectoryBrowser()); + + app.UseDirectoryBrowser(new DirectoryBrowserOptions() + { + RequestPath = new PathString(baseUrl), + FileProvider = new PhysicalFileProvider(Path.Combine(Environment.CurrentDirectory, baseDir)) + }); + }); + HttpResponseMessage response = await server.CreateRequest(requestUrl).SendAsync("HEAD"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); diff --git a/test/Microsoft.AspNet.StaticFiles.Tests/project.json b/test/Microsoft.AspNet.StaticFiles.Tests/project.json index 8184934ae8..875855c301 100644 --- a/test/Microsoft.AspNet.StaticFiles.Tests/project.json +++ b/test/Microsoft.AspNet.StaticFiles.Tests/project.json @@ -1,6 +1,7 @@ { "dependencies": { "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.AspNet.RequestContainer": "1.0.0-*", "Microsoft.AspNet.StaticFiles": "1.0.0-*", "Microsoft.AspNet.TestHost": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" @@ -15,4 +16,4 @@ } } } -} +} \ No newline at end of file