From ff5aed132bd04e85a17ba3273490fc873fb4e4e3 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Mon, 30 Oct 2017 18:20:06 -0700 Subject: [PATCH] Use ASPNETCORE_HTTPS_PORT to get port from config (#266) --- samples/HttpsPolicySample/Startup.cs | 2 +- .../HttpsRedirectionBuilderExtensions.cs | 18 +++++++- .../HttpsRedirectionOptions.cs | 2 +- .../HttpsRedirectionServicesExtensions.cs | 1 - .../HttpsPolicyTests.cs | 2 +- .../HttpsRedirectionMiddlewareTests.cs | 44 +++++++++++++++++-- 6 files changed, 60 insertions(+), 9 deletions(-) diff --git a/samples/HttpsPolicySample/Startup.cs b/samples/HttpsPolicySample/Startup.cs index 4fb7e62871..1c9f11fcad 100644 --- a/samples/HttpsPolicySample/Startup.cs +++ b/samples/HttpsPolicySample/Startup.cs @@ -21,7 +21,7 @@ namespace HttpsSample services.AddHttpsRedirection(options => { options.RedirectStatusCode = StatusCodes.Status301MovedPermanently; - options.TlsPort = 5001; + options.HttpsPort = 5001; }); services.AddHsts(options => diff --git a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionBuilderExtensions.cs b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionBuilderExtensions.cs index 89823a0e7c..d6b827caab 100644 --- a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionBuilderExtensions.cs @@ -4,6 +4,7 @@ using System; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.AspNetCore.Rewrite; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -31,10 +32,25 @@ namespace Microsoft.AspNetCore.Builder var options = app.ApplicationServices.GetRequiredService>().Value; + // The tls port set in options will have priority over the one in configuration. + var httpsPort = options.HttpsPort; + if (httpsPort == null) + { + // Only read configuration if there is no httpsPort + var config = app.ApplicationServices.GetRequiredService(); + var configHttpsPort = config["HTTPS_PORT"]; + // If the string isn't empty, try to parse it. + if (!string.IsNullOrEmpty(configHttpsPort) + && int.TryParse(configHttpsPort, out var intHttpsPort)) + { + httpsPort = intHttpsPort; + } + } + var rewriteOptions = new RewriteOptions(); rewriteOptions.AddRedirectToHttps( options.RedirectStatusCode, - options.TlsPort); + httpsPort); app.UseRewriter(rewriteOptions); diff --git a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionOptions.cs b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionOptions.cs index d73df4d59b..38f7026e25 100644 --- a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionOptions.cs +++ b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionOptions.cs @@ -21,6 +21,6 @@ namespace Microsoft.AspNetCore.HttpsPolicy /// /// Defaults to 443 if not provided. /// - public int? TlsPort { get; set; } + public int? HttpsPort { get; set; } } } diff --git a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionServicesExtensions.cs b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionServicesExtensions.cs index cdc6f005bc..24c9e114e8 100644 --- a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionServicesExtensions.cs +++ b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionServicesExtensions.cs @@ -28,7 +28,6 @@ namespace Microsoft.AspNetCore.Builder { throw new ArgumentNullException(nameof(configureOptions)); } - services.Configure(configureOptions); return services; } diff --git a/test/Microsoft.AspNetCore.HttpsEnforcement.Tests/HttpsPolicyTests.cs b/test/Microsoft.AspNetCore.HttpsEnforcement.Tests/HttpsPolicyTests.cs index 58a0be138c..57e3546153 100644 --- a/test/Microsoft.AspNetCore.HttpsEnforcement.Tests/HttpsPolicyTests.cs +++ b/test/Microsoft.AspNetCore.HttpsEnforcement.Tests/HttpsPolicyTests.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests services.Configure(options => { options.RedirectStatusCode = statusCode; - options.TlsPort = tlsPort; + options.HttpsPort = tlsPort; }); services.Configure(options => { diff --git a/test/Microsoft.AspNetCore.HttpsEnforcement.Tests/HttpsRedirectionMiddlewareTests.cs b/test/Microsoft.AspNetCore.HttpsEnforcement.Tests/HttpsRedirectionMiddlewareTests.cs index 1e77683bf7..e9312decba 100644 --- a/test/Microsoft.AspNetCore.HttpsEnforcement.Tests/HttpsRedirectionMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.HttpsEnforcement.Tests/HttpsRedirectionMiddlewareTests.cs @@ -52,7 +52,7 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests [InlineData(308, null, "https://localhost/")] [InlineData(301, 5050, "https://localhost:5050/")] [InlineData(301, 443, "https://localhost/")] - public async Task SetOptions_SetStatusCodeTlsPort(int statusCode, int? tlsPort, string expected) + public async Task SetOptions_SetStatusCodeHttpsPort(int statusCode, int? httpsPort, string expected) { var builder = new WebHostBuilder() @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests services.Configure(options => { options.RedirectStatusCode = statusCode; - options.TlsPort = tlsPort; + options.HttpsPort = httpsPort; }); }) .Configure(app => @@ -91,7 +91,7 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests [InlineData(308, null, "https://localhost/")] [InlineData(301, 5050, "https://localhost:5050/")] [InlineData(301, 443, "https://localhost/")] - public async Task SetOptionsThroughHelperMethod_SetStatusCodeTlsPort(int statusCode, int? tlsPort, string expectedUrl) + public async Task SetOptionsThroughHelperMethod_SetStatusCodeAndHttpsPort(int statusCode, int? httpsPort, string expectedUrl) { var builder = new WebHostBuilder() .ConfigureServices(services => @@ -99,7 +99,7 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests services.AddHttpsRedirection(options => { options.RedirectStatusCode = statusCode; - options.TlsPort = tlsPort; + options.HttpsPort = httpsPort; }); }) .Configure(app => @@ -121,5 +121,41 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests Assert.Equal(statusCode, (int)response.StatusCode); Assert.Equal(expectedUrl, response.Headers.Location.ToString()); } + + [Theory] + [InlineData(null, null, "https://localhost/")] + [InlineData(null, "5000", "https://localhost:5000/")] + [InlineData(null, "443", "https://localhost/")] + [InlineData(443, "5000", "https://localhost/")] + [InlineData(4000, "5000", "https://localhost:4000/")] + [InlineData(5000, null, "https://localhost:5000/")] + public async Task SetHttpsPortEnvironmentVariable_ReturnsCorrectStatusCodeOnResponse(int? optionsHttpsPort, string configHttpsPort, string expectedUrl) + { + var builder = new WebHostBuilder() + .ConfigureServices(services => + { + services.AddHttpsRedirection(options => + { + options.HttpsPort = optionsHttpsPort; + }); + }) + .Configure(app => + { + app.UseHttpsRedirection(); + app.Run(context => + { + return context.Response.WriteAsync("Hello world"); + }); + }); + builder.UseSetting("HTTPS_PORT", configHttpsPort); + var server = new TestServer(builder); + var client = server.CreateClient(); + + var request = new HttpRequestMessage(HttpMethod.Get, ""); + + var response = await client.SendAsync(request); + + Assert.Equal(expectedUrl, response.Headers.Location.ToString()); + } } }