Throw if UseUrls specifies HTTPS or path base (#1519).
This commit is contained in:
parent
e64bffd25c
commit
1be31ae2ce
|
|
@ -146,6 +146,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel
|
||||||
{
|
{
|
||||||
var parsedAddress = ServerAddress.FromUrl(address);
|
var parsedAddress = ServerAddress.FromUrl(address);
|
||||||
|
|
||||||
|
if (parsedAddress.Scheme.Equals("https", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"HTTPS endpoints can only be configured using {nameof(KestrelServerOptions)}.{nameof(KestrelServerOptions.Listen)}().");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(parsedAddress.PathBase))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"A path base can only be configured using {nameof(IApplicationBuilder)}.UsePathBase().");
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(parsedAddress.PathBase))
|
if (!string.IsNullOrEmpty(parsedAddress.PathBase))
|
||||||
{
|
{
|
||||||
_logger.LogWarning($"Path base in address {address} is not supported and will be ignored. To specify a path base, use {nameof(IApplicationBuilder)}.UsePathBase().");
|
_logger.LogWarning($"Path base in address {address} is not supported and will be ignored. To specify a path base, use {nameof(IApplicationBuilder)}.UsePathBase().");
|
||||||
|
|
|
||||||
|
|
@ -289,9 +289,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
|
||||||
dataset.Add($"http://*:{port}/", _ => new[] { $"http://127.0.0.1:{port}/" });
|
dataset.Add($"http://*:{port}/", _ => new[] { $"http://127.0.0.1:{port}/" });
|
||||||
dataset.Add($"http://+:{port}/", _ => new[] { $"http://127.0.0.1:{port}/" });
|
dataset.Add($"http://+:{port}/", _ => new[] { $"http://127.0.0.1:{port}/" });
|
||||||
|
|
||||||
// Path after port
|
|
||||||
dataset.Add($"http://127.0.0.1:{port}/base/path", _ => new[] { $"http://127.0.0.1:{port}/base/path" });
|
|
||||||
|
|
||||||
// Dynamic port and non-loopback addresses
|
// Dynamic port and non-loopback addresses
|
||||||
dataset.Add("http://127.0.0.1:0/", GetTestUrls);
|
dataset.Add("http://127.0.0.1:0/", GetTestUrls);
|
||||||
dataset.Add($"http://{Dns.GetHostName()}:0/", GetTestUrls);
|
dataset.Add($"http://{Dns.GetHostName()}:0/", GetTestUrls);
|
||||||
|
|
@ -411,10 +408,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
|
||||||
dataset.Add($"http://127.0.0.1:{port}/;http://[::1]:{port}/",
|
dataset.Add($"http://127.0.0.1:{port}/;http://[::1]:{port}/",
|
||||||
_ => new[] { $"http://127.0.0.1:{port}/", $"http://[::1]:{port}/" });
|
_ => new[] { $"http://127.0.0.1:{port}/", $"http://[::1]:{port}/" });
|
||||||
|
|
||||||
// Path after port
|
|
||||||
dataset.Add($"http://[::1]:{port}/base/path",
|
|
||||||
_ => new[] { $"http://[::1]:{port}/base/path" });
|
|
||||||
|
|
||||||
// Dynamic port and non-loopback addresses
|
// Dynamic port and non-loopback addresses
|
||||||
var ipv6Addresses = GetIPAddresses()
|
var ipv6Addresses = GetIPAddresses()
|
||||||
.Where(ip => ip.AddressFamily == AddressFamily.InterNetworkV6)
|
.Where(ip => ip.AddressFamily == AddressFamily.InterNetworkV6)
|
||||||
|
|
|
||||||
|
|
@ -566,64 +566,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Theory]
|
|
||||||
[InlineData("/base", "/base")]
|
|
||||||
[InlineData("/base", "/base/")]
|
|
||||||
[InlineData("/base", "/base/something")]
|
|
||||||
[InlineData("/base", "/base/something/")]
|
|
||||||
[InlineData("/base/something", "/base/something")]
|
|
||||||
[InlineData("/base/something", "/base/something/")]
|
|
||||||
[InlineData("/base/something", "/base/something/more")]
|
|
||||||
[InlineData("/base/something", "/base/something/more/")]
|
|
||||||
public async Task DoesNotSplitPathBase(string registerPathBase, string requestPath)
|
|
||||||
{
|
|
||||||
var testLogger = new TestApplicationErrorLogger();
|
|
||||||
|
|
||||||
string contextPathBase = null;
|
|
||||||
string contextPath = null;
|
|
||||||
|
|
||||||
var builder = new WebHostBuilder()
|
|
||||||
.UseKestrel()
|
|
||||||
.UseUrls($"http://127.0.0.1:0{registerPathBase}")
|
|
||||||
.ConfigureServices(services =>
|
|
||||||
{
|
|
||||||
services.AddSingleton<ILoggerFactory>(new KestrelTestLoggerFactory(testLogger));
|
|
||||||
})
|
|
||||||
.Configure(app =>
|
|
||||||
{
|
|
||||||
app.Run(context =>
|
|
||||||
{
|
|
||||||
contextPathBase = context.Request.PathBase;
|
|
||||||
contextPath = context.Request.Path;
|
|
||||||
|
|
||||||
return TaskCache.CompletedTask;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
using (var host = builder.Build())
|
|
||||||
{
|
|
||||||
host.Start();
|
|
||||||
|
|
||||||
using (var connection = new TestConnection(host.GetPort()))
|
|
||||||
{
|
|
||||||
await connection.Send($"GET {requestPath} HTTP/1.1\r\n\r\n");
|
|
||||||
await connection.Receive("HTTP/1.1 200 OK");
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert.Single(testLogger.Messages, log =>
|
|
||||||
log.LogLevel == LogLevel.Warning &&
|
|
||||||
string.Equals(
|
|
||||||
$"Path base in address http://127.0.0.1:0{registerPathBase} is not supported and will be ignored. To specify a path base, use {nameof(IApplicationBuilder)}.UsePathBase().",
|
|
||||||
log.Message,
|
|
||||||
StringComparison.Ordinal));
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert.Equal("", contextPathBase);
|
|
||||||
Assert.Equal(requestPath, contextPath);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task TestRemoteIPAddress(string registerAddress, string requestAddress, string expectAddress)
|
private async Task TestRemoteIPAddress(string registerAddress, string requestAddress, string expectAddress)
|
||||||
{
|
{
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.KestrelTests
|
namespace Microsoft.AspNetCore.Server.KestrelTests
|
||||||
{
|
{
|
||||||
|
|
@ -35,6 +36,42 @@ namespace Microsoft.AspNetCore.Server.KestrelTests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void StartWithHttpsAddressThrows()
|
||||||
|
{
|
||||||
|
var testLogger = new TestApplicationErrorLogger { ThrowOnCriticalErrors = false };
|
||||||
|
|
||||||
|
using (var server = CreateServer(new KestrelServerOptions(), testLogger))
|
||||||
|
{
|
||||||
|
server.Features.Get<IServerAddressesFeature>().Addresses.Add("https://127.0.0.1:0");
|
||||||
|
|
||||||
|
var exception = Assert.Throws<InvalidOperationException>(() => StartDummyApplication(server));
|
||||||
|
|
||||||
|
Assert.Equal(
|
||||||
|
$"HTTPS endpoints can only be configured using {nameof(KestrelServerOptions)}.{nameof(KestrelServerOptions.Listen)}().",
|
||||||
|
exception.Message);
|
||||||
|
Assert.Equal(1, testLogger.CriticalErrorsLogged);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void StartWithPathBaseInAddressThrows()
|
||||||
|
{
|
||||||
|
var testLogger = new TestApplicationErrorLogger { ThrowOnCriticalErrors = false };
|
||||||
|
|
||||||
|
using (var server = CreateServer(new KestrelServerOptions(), testLogger))
|
||||||
|
{
|
||||||
|
server.Features.Get<IServerAddressesFeature>().Addresses.Add("http://127.0.0.1:0/base");
|
||||||
|
|
||||||
|
var exception = Assert.Throws<InvalidOperationException>(() => StartDummyApplication(server));
|
||||||
|
|
||||||
|
Assert.Equal(
|
||||||
|
$"A path base can only be configured using {nameof(IApplicationBuilder)}.UsePathBase().",
|
||||||
|
exception.Message);
|
||||||
|
Assert.Equal(1, testLogger.CriticalErrorsLogged);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData("http://localhost:5000")]
|
[InlineData("http://localhost:5000")]
|
||||||
[InlineData("The value of the string shouldn't matter.")]
|
[InlineData("The value of the string shouldn't matter.")]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue