| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- commit fd4cd6f58b2412d4ca6e264803356af5fc474e5a
- Author: Justin Kotalik <[email protected]>
- Date: Tue Dec 19 22:44:24 2017 -0800
- Read from IServerAddressesFeature for HTTPS port (#276)
- diff --git a/build/dependencies.props b/build/dependencies.props
- index 229023f5d03..853f6f2f0e6 100644
- --- a/build/dependencies.props
- +++ b/build/dependencies.props
- @@ -3,23 +3,25 @@
- <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
- </PropertyGroup>
- <PropertyGroup Label="Package Versions">
- - <InternalAspNetCoreSdkPackageVersion>2.1.0-preview1-15626</InternalAspNetCoreSdkPackageVersion>
- - <MicrosoftAspNetCoreHostingAbstractionsPackageVersion>2.1.0-preview1-27849</MicrosoftAspNetCoreHostingAbstractionsPackageVersion>
- - <MicrosoftAspNetCoreHttpAbstractionsPackageVersion>2.1.0-preview1-27849</MicrosoftAspNetCoreHttpAbstractionsPackageVersion>
- - <MicrosoftAspNetCoreHttpExtensionsPackageVersion>2.1.0-preview1-27849</MicrosoftAspNetCoreHttpExtensionsPackageVersion>
- - <MicrosoftAspNetCoreHttpPackageVersion>2.1.0-preview1-27849</MicrosoftAspNetCoreHttpPackageVersion>
- - <MicrosoftAspNetCoreServerKestrelHttpsPackageVersion>2.1.0-preview1-27849</MicrosoftAspNetCoreServerKestrelHttpsPackageVersion>
- - <MicrosoftAspNetCoreServerKestrelPackageVersion>2.1.0-preview1-27849</MicrosoftAspNetCoreServerKestrelPackageVersion>
- - <MicrosoftAspNetCoreTestHostPackageVersion>2.1.0-preview1-27849</MicrosoftAspNetCoreTestHostPackageVersion>
- - <MicrosoftExtensionsConfigurationAbstractionsPackageVersion>2.1.0-preview1-27849</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
- - <MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>2.1.0-preview1-27849</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
- - <MicrosoftExtensionsLoggingAbstractionsPackageVersion>2.1.0-preview1-27849</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
- - <MicrosoftExtensionsLoggingConsolePackageVersion>2.1.0-preview1-27849</MicrosoftExtensionsLoggingConsolePackageVersion>
- - <MicrosoftExtensionsLoggingTestingPackageVersion>2.1.0-preview1-27849</MicrosoftExtensionsLoggingTestingPackageVersion>
- - <MicrosoftExtensionsOptionsPackageVersion>2.1.0-preview1-27849</MicrosoftExtensionsOptionsPackageVersion>
- + <InternalAspNetCoreSdkPackageVersion>2.1.0-preview1-15638</InternalAspNetCoreSdkPackageVersion>
- + <MicrosoftAspNetCoreHostingAbstractionsPackageVersion>2.1.0-preview1-27855</MicrosoftAspNetCoreHostingAbstractionsPackageVersion>
- + <MicrosoftAspNetCoreHttpAbstractionsPackageVersion>2.1.0-preview1-27855</MicrosoftAspNetCoreHttpAbstractionsPackageVersion>
- + <MicrosoftAspNetCoreHttpExtensionsPackageVersion>2.1.0-preview1-27855</MicrosoftAspNetCoreHttpExtensionsPackageVersion>
- + <MicrosoftAspNetCoreHttpPackageVersion>2.1.0-preview1-27855</MicrosoftAspNetCoreHttpPackageVersion>
- + <MicrosoftAspNetCoreServerKestrelCorePackageVersion>2.1.0-preview1-27855</MicrosoftAspNetCoreServerKestrelCorePackageVersion>
- + <MicrosoftAspNetCoreServerKestrelHttpsPackageVersion>2.1.0-preview1-27855</MicrosoftAspNetCoreServerKestrelHttpsPackageVersion>
- + <MicrosoftAspNetCoreServerKestrelPackageVersion>2.1.0-preview1-27855</MicrosoftAspNetCoreServerKestrelPackageVersion>
- + <MicrosoftAspNetCoreTestHostPackageVersion>2.1.0-preview1-27855</MicrosoftAspNetCoreTestHostPackageVersion>
- + <MicrosoftExtensionsConfigurationAbstractionsPackageVersion>2.1.0-preview1-27855</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
- + <MicrosoftExtensionsConfigurationBinderPackageVersion>2.1.0-preview1-27855</MicrosoftExtensionsConfigurationBinderPackageVersion>
- + <MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>2.1.0-preview1-27855</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
- + <MicrosoftExtensionsLoggingAbstractionsPackageVersion>2.1.0-preview1-27855</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
- + <MicrosoftExtensionsLoggingConsolePackageVersion>2.1.0-preview1-27855</MicrosoftExtensionsLoggingConsolePackageVersion>
- + <MicrosoftExtensionsLoggingTestingPackageVersion>2.1.0-preview1-27855</MicrosoftExtensionsLoggingTestingPackageVersion>
- + <MicrosoftExtensionsOptionsPackageVersion>2.1.0-preview1-27855</MicrosoftExtensionsOptionsPackageVersion>
- <MicrosoftNETCoreApp20PackageVersion>2.0.0</MicrosoftNETCoreApp20PackageVersion>
- <MicrosoftNETCoreApp21PackageVersion>2.1.0-preview1-26016-05</MicrosoftNETCoreApp21PackageVersion>
- - <MicrosoftNetHttpHeadersPackageVersion>2.1.0-preview1-27849</MicrosoftNetHttpHeadersPackageVersion>
- + <MicrosoftNetHttpHeadersPackageVersion>2.1.0-preview1-27855</MicrosoftNetHttpHeadersPackageVersion>
- <MicrosoftNETTestSdkPackageVersion>15.3.0</MicrosoftNETTestSdkPackageVersion>
- <MoqPackageVersion>4.7.49</MoqPackageVersion>
- <XunitAnalyzersPackageVersion>0.8.0</XunitAnalyzersPackageVersion>
- diff --git a/korebuild-lock.txt b/korebuild-lock.txt
- index 8d52a6128cc..2e540bdffd1 100644
- --- a/korebuild-lock.txt
- +++ b/korebuild-lock.txt
- @@ -1,2 +1,2 @@
- -version:2.1.0-preview1-15626
- -commithash:fd6410e9c90c428bc01238372303ad09cb9ec889
- +version:2.1.0-preview1-15638
- +commithash:1d3a0c725dc6b8ae6b0e47800fd6b4d8f8b8d545
- diff --git a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionBuilderExtensions.cs b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionBuilderExtensions.cs
- index d6b827caab8..600e29fead2 100644
- --- a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionBuilderExtensions.cs
- +++ b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionBuilderExtensions.cs
- @@ -2,8 +2,8 @@
- // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
- using System;
- +using Microsoft.AspNetCore.Hosting.Server.Features;
- using Microsoft.AspNetCore.HttpsPolicy;
- -using Microsoft.AspNetCore.Rewrite;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.Extensions.Options;
- @@ -32,27 +32,7 @@ namespace Microsoft.AspNetCore.Builder
-
- var options = app.ApplicationServices.GetRequiredService<IOptions<HttpsRedirectionOptions>>().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<IConfiguration>();
- - 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,
- - httpsPort);
- -
- - app.UseRewriter(rewriteOptions);
- + app.UseMiddleware<HttpsRedirectionMiddleware>(app.ServerFeatures.Get<IServerAddressesFeature>());
-
- return app;
- }
- diff --git a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionMiddleware.cs b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionMiddleware.cs
- new file mode 100644
- index 00000000000..f500bbb2bce
- --- /dev/null
- +++ b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionMiddleware.cs
- @@ -0,0 +1,124 @@
- +// 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;
- +using System.Threading.Tasks;
- +using Microsoft.AspNetCore.Hosting.Server.Features;
- +using Microsoft.AspNetCore.Http;
- +using Microsoft.AspNetCore.Http.Extensions;
- +using Microsoft.AspNetCore.Http.Internal;
- +using Microsoft.Extensions.Configuration;
- +using Microsoft.Extensions.Options;
- +using Microsoft.Net.Http.Headers;
- +
- +namespace Microsoft.AspNetCore.HttpsPolicy
- +{
- + public class HttpsRedirectionMiddleware
- + {
- + private readonly RequestDelegate _next;
- + private int? _httpsPort;
- + private readonly int _statusCode;
- +
- + private readonly IServerAddressesFeature _serverAddressesFeature;
- + private readonly IConfiguration _config;
- +
- + /// <summary>
- + /// Initializes the HttpsRedirectionMiddleware
- + /// </summary>
- + /// <param name="next"></param>
- + /// <param name="serverAddressesFeature">The</param>
- + /// <param name="options"></param>
- + /// <param name="config"></param>
- + public HttpsRedirectionMiddleware(RequestDelegate next, IServerAddressesFeature serverAddressesFeature, IOptions<HttpsRedirectionOptions> options, IConfiguration config)
- + {
- + if (options == null)
- + {
- + throw new ArgumentNullException(nameof(options));
- + }
- + _config = config ?? throw new ArgumentException(nameof(config));
- + _next = next ?? throw new ArgumentNullException(nameof(next));
- + _serverAddressesFeature = serverAddressesFeature ?? throw new ArgumentNullException(nameof(serverAddressesFeature));
- +
- + var httpsRedirectionOptions = options.Value;
- + _httpsPort = httpsRedirectionOptions.HttpsPort;
- + _statusCode = httpsRedirectionOptions.RedirectStatusCode;
- + }
- +
- + /// <summary>
- + /// Invokes the HttpsRedirectionMiddleware
- + /// </summary>
- + /// <param name="context"></param>
- + /// <returns></returns>
- + public Task Invoke(HttpContext context)
- + {
- + if (context.Request.IsHttps)
- + {
- + return _next(context);
- + }
- +
- + if (!_httpsPort.HasValue)
- + {
- + CheckForHttpsPorts();
- + }
- +
- + var host = context.Request.Host;
- + if (_httpsPort != 443)
- + {
- + host = new HostString(host.Host, _httpsPort.Value);
- + }
- + else
- + {
- + host = new HostString(host.Host);
- + }
- +
- + var request = context.Request;
- + var redirectUrl = UriHelper.BuildAbsolute(
- + "https",
- + host,
- + request.PathBase,
- + request.Path,
- + request.QueryString);
- +
- + context.Response.StatusCode = _statusCode;
- + context.Response.Headers[HeaderNames.Location] = redirectUrl;
- +
- + return Task.CompletedTask;
- + }
- +
- + private void CheckForHttpsPorts()
- + {
- + // The IServerAddressesFeature will not be ready until the middleware is Invoked,
- + // Order for finding the HTTPS port:
- + // 1. Set in the HttpsRedirectionOptions
- + // 2. HTTPS_PORT environment variable
- + // 3. IServerAddressesFeature
- + // 4. 443 (or not set)
- +
- + _httpsPort = _config.GetValue<int?>("HTTPS_PORT");
- + if (_httpsPort.HasValue)
- + {
- + return;
- + }
- +
- + int? httpsPort = null;
- + foreach (var address in _serverAddressesFeature.Addresses)
- + {
- + var bindingAddress = BindingAddress.Parse(address);
- + if (bindingAddress.Scheme.Equals("https", StringComparison.OrdinalIgnoreCase))
- + {
- + // If we find multiple different https ports specified, throw
- + if (httpsPort.HasValue && httpsPort != bindingAddress.Port)
- + {
- + throw new ArgumentException("Cannot determine the https port from IServerAddressesFeature, multiple values were found. " +
- + "Please set the desired port explicitly on HttpsRedirectionOptions.HttpsPort.");
- + }
- + else
- + {
- + httpsPort = bindingAddress.Port;
- + }
- + }
- + }
- + _httpsPort = httpsPort ?? 443;
- + }
- + }
- +}
- diff --git a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionOptions.cs b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionOptions.cs
- index 238f2eb4843..52f2b09def7 100644
- --- a/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionOptions.cs
- +++ b/src/Microsoft.AspNetCore.HttpsPolicy/HttpsRedirectionOptions.cs
- @@ -16,10 +16,13 @@ namespace Microsoft.AspNetCore.HttpsPolicy
- public int RedirectStatusCode { get; set; } = StatusCodes.Status302Found;
-
- /// <summary>
- - /// The TLS port to be added to the redirected URL.
- + /// The HTTPS port to be added to the redirected URL.
- /// </summary>
- /// <remarks>
- - /// Defaults to 443 if not provided.
- + /// If the HttpsPort is not set, we will try to get the HttpsPort from the following:
- + /// 1. HTTPS_PORT environment variable
- + /// 2. IServerAddressesFeature
- + /// 3. 443 (or not set)
- /// </remarks>
- public int? HttpsPort { get; set; }
- }
- diff --git a/src/Microsoft.AspNetCore.HttpsPolicy/Microsoft.AspNetCore.HttpsPolicy.csproj b/src/Microsoft.AspNetCore.HttpsPolicy/Microsoft.AspNetCore.HttpsPolicy.csproj
- index b68d33b7dc1..ee7e611a475 100644
- --- a/src/Microsoft.AspNetCore.HttpsPolicy/Microsoft.AspNetCore.HttpsPolicy.csproj
- +++ b/src/Microsoft.AspNetCore.HttpsPolicy/Microsoft.AspNetCore.HttpsPolicy.csproj
- @@ -11,6 +11,10 @@
- </PropertyGroup>
-
- <ItemGroup>
- - <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Rewrite\Microsoft.AspNetCore.Rewrite.csproj" />
- + <PackageReference Include="Microsoft.AspNetCore.Http" Version="$(MicrosoftAspNetCoreHttpAbstractionsPackageVersion)" />
- + <PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="$(MicrosoftAspNetCoreHttpExtensionsPackageVersion)" />
- + <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="$(MicrosoftExtensionsConfigurationBinderPackageVersion)" />
- + <PackageReference Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsOptionsPackageVersion)" />
- + <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="$(MicrosoftAspNetCoreHostingAbstractionsPackageVersion)" />
- </ItemGroup>
- </Project>
- diff --git a/test/Microsoft.AspNetCore.HttpsPolicy.Tests/HttpsPolicyTests.cs b/test/Microsoft.AspNetCore.HttpsPolicy.Tests/HttpsPolicyTests.cs
- index 49a3d0a29a2..aa874fb8cd9 100644
- --- a/test/Microsoft.AspNetCore.HttpsPolicy.Tests/HttpsPolicyTests.cs
- +++ b/test/Microsoft.AspNetCore.HttpsPolicy.Tests/HttpsPolicyTests.cs
- @@ -8,7 +8,9 @@ using System.Net.Http;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore.Builder;
- using Microsoft.AspNetCore.Hosting;
- +using Microsoft.AspNetCore.Hosting.Server.Features;
- using Microsoft.AspNetCore.Http;
- +using Microsoft.AspNetCore.Http.Features;
- using Microsoft.AspNetCore.TestHost;
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.Net.Http.Headers;
- @@ -55,7 +57,9 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests
- });
- });
-
- - var server = new TestServer(builder);
- + var featureCollection = new FeatureCollection();
- + featureCollection.Set<IServerAddressesFeature>(new ServerAddressesFeature());
- + var server = new TestServer(builder, featureCollection);
- var client = server.CreateClient();
-
- var request = new HttpRequestMessage(HttpMethod.Get, "");
- diff --git a/test/Microsoft.AspNetCore.HttpsPolicy.Tests/HttpsRedirectionMiddlewareTests.cs b/test/Microsoft.AspNetCore.HttpsPolicy.Tests/HttpsRedirectionMiddlewareTests.cs
- index aabba1324ea..14f7c5444f5 100644
- --- a/test/Microsoft.AspNetCore.HttpsPolicy.Tests/HttpsRedirectionMiddlewareTests.cs
- +++ b/test/Microsoft.AspNetCore.HttpsPolicy.Tests/HttpsRedirectionMiddlewareTests.cs
- @@ -8,7 +8,9 @@ using System.Net.Http;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore.Builder;
- using Microsoft.AspNetCore.Hosting;
- +using Microsoft.AspNetCore.Hosting.Server.Features;
- using Microsoft.AspNetCore.Http;
- +using Microsoft.AspNetCore.Http.Features;
- using Microsoft.AspNetCore.TestHost;
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.Net.Http.Headers;
- @@ -34,7 +36,9 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests
- });
- });
-
- - var server = new TestServer(builder);
- + var featureCollection = new FeatureCollection();
- + featureCollection.Set<IServerAddressesFeature>(new ServerAddressesFeature());
- + var server = new TestServer(builder, featureCollection);
- var client = server.CreateClient();
-
- var request = new HttpRequestMessage(HttpMethod.Get, "");
- @@ -73,7 +77,9 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests
- });
- });
-
- - var server = new TestServer(builder);
- + var featureCollection = new FeatureCollection();
- + featureCollection.Set<IServerAddressesFeature>(new ServerAddressesFeature());
- + var server = new TestServer(builder, featureCollection);
- var client = server.CreateClient();
-
- var request = new HttpRequestMessage(HttpMethod.Get, "");
- @@ -111,7 +117,9 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests
- });
- });
-
- - var server = new TestServer(builder);
- + var featureCollection = new FeatureCollection();
- + featureCollection.Set<IServerAddressesFeature>(new ServerAddressesFeature());
- + var server = new TestServer(builder, featureCollection);
- var client = server.CreateClient();
-
- var request = new HttpRequestMessage(HttpMethod.Get, "");
- @@ -123,13 +131,17 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests
- }
-
- [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)
- + [InlineData(null, null, null, "https://localhost/")]
- + [InlineData(null, null, "https://localhost:4444/", "https://localhost:4444/")]
- + [InlineData(null, null, "https://localhost:443/", "https://localhost/")]
- + [InlineData(null, null, "http://localhost:5044/", "https://localhost/")]
- + [InlineData(null, null, "https://localhost/", "https://localhost/")]
- + [InlineData(null, "5000", "https://localhost:4444/", "https://localhost:5000/")]
- + [InlineData(null, "443", "https://localhost:4444/", "https://localhost/")]
- + [InlineData(443, "5000", "https://localhost:4444/", "https://localhost/")]
- + [InlineData(4000, "5000", "https://localhost:4444/", "https://localhost:4000/")]
- + [InlineData(5000, null, "https://localhost:4444/", "https://localhost:5000/")]
- + public async Task SetHttpsPortEnvironmentVariableAndServerFeature_ReturnsCorrectStatusCodeOnResponse(int? optionsHttpsPort, string configHttpsPort, string serverAddressFeatureUrl, string expectedUrl)
- {
- var builder = new WebHostBuilder()
- .ConfigureServices(services =>
- @@ -147,8 +159,18 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests
- return context.Response.WriteAsync("Hello world");
- });
- });
- +
- builder.UseSetting("HTTPS_PORT", configHttpsPort);
- - var server = new TestServer(builder);
- +
- + var featureCollection = new FeatureCollection();
- + featureCollection.Set<IServerAddressesFeature>(new ServerAddressesFeature());
- +
- + var server = new TestServer(builder, featureCollection);
- + if (serverAddressFeatureUrl != null)
- + {
- + server.Features.Get<IServerAddressesFeature>().Addresses.Add(serverAddressFeatureUrl);
- + }
- +
- var client = server.CreateClient();
-
- var request = new HttpRequestMessage(HttpMethod.Get, "");
- @@ -157,5 +179,106 @@ namespace Microsoft.AspNetCore.HttpsPolicy.Tests
-
- Assert.Equal(expectedUrl, response.Headers.Location.ToString());
- }
- +
- + [Fact]
- + public async Task SetServerAddressesFeature_SingleHttpsAddress_Success()
- + {
- + var builder = new WebHostBuilder()
- + .ConfigureServices(services =>
- + {
- + services.AddHttpsRedirection(options =>
- + {
- + });
- + })
- + .Configure(app =>
- + {
- + app.UseHttpsRedirection();
- + app.Run(context =>
- + {
- + return context.Response.WriteAsync("Hello world");
- + });
- + });
- +
- + var featureCollection = new FeatureCollection();
- + featureCollection.Set<IServerAddressesFeature>(new ServerAddressesFeature());
- + var server = new TestServer(builder, featureCollection);
- +
- + server.Features.Get<IServerAddressesFeature>().Addresses.Add("https://localhost:5050");
- + var client = server.CreateClient();
- +
- + var request = new HttpRequestMessage(HttpMethod.Get, "");
- +
- + var response = await client.SendAsync(request);
- +
- + Assert.Equal("https://localhost:5050/", response.Headers.Location.ToString());
- + }
- +
- + [Fact]
- + public async Task SetServerAddressesFeature_MultipleHttpsAddresses_ThrowInMiddleware()
- + {
- + var builder = new WebHostBuilder()
- + .ConfigureServices(services =>
- + {
- + services.AddHttpsRedirection(options =>
- + {
- + });
- + })
- + .Configure(app =>
- + {
- + app.UseHttpsRedirection();
- + app.Run(context =>
- + {
- + return context.Response.WriteAsync("Hello world");
- + });
- + });
- +
- + var featureCollection = new FeatureCollection();
- + featureCollection.Set<IServerAddressesFeature>(new ServerAddressesFeature());
- + var server = new TestServer(builder, featureCollection);
- +
- + server.Features.Get<IServerAddressesFeature>().Addresses.Add("https://localhost:5050");
- + server.Features.Get<IServerAddressesFeature>().Addresses.Add("https://localhost:5051");
- +
- + var client = server.CreateClient();
- +
- + var request = new HttpRequestMessage(HttpMethod.Get, "");
- +
- + await Assert.ThrowsAsync<ArgumentException>(async () => await client.SendAsync(request));
- + }
- +
- + [Fact]
- + public async Task SetServerAddressesFeature_MultipleHttpsAddressesWithSamePort_Success()
- + {
- + var builder = new WebHostBuilder()
- + .ConfigureServices(services =>
- + {
- + services.AddHttpsRedirection(options =>
- + {
- + });
- + })
- + .Configure(app =>
- + {
- + app.UseHttpsRedirection();
- + app.Run(context =>
- + {
- + return context.Response.WriteAsync("Hello world");
- + });
- + });
- +
- + var featureCollection = new FeatureCollection();
- + featureCollection.Set<IServerAddressesFeature>(new ServerAddressesFeature());
- + var server = new TestServer(builder, featureCollection);
- +
- + server.Features.Get<IServerAddressesFeature>().Addresses.Add("https://localhost:5050");
- + server.Features.Get<IServerAddressesFeature>().Addresses.Add("https://localhost:5050");
- +
- + var client = server.CreateClient();
- +
- + var request = new HttpRequestMessage(HttpMethod.Get, "");
- +
- + var response = await client.SendAsync(request);
- +
- + Assert.Equal("https://localhost:5050/", response.Headers.Location.ToString());
- + }
- }
- }
|