From 4a37240a9d41ffeb07d57952732dc156f50d1683 Mon Sep 17 00:00:00 2001 From: Andrew Whewell Date: Sat, 7 Sep 2019 21:32:31 +0100 Subject: [PATCH] Support weak and strong wildcards in URL prefixes --- src/Nancy.Hosting.Self/HostConfiguration.cs | 11 ++++ src/Nancy.Hosting.Self/NancyHost.cs | 2 +- .../NancySelfHostFixture.cs | 52 +++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/Nancy.Hosting.Self/HostConfiguration.cs b/src/Nancy.Hosting.Self/HostConfiguration.cs index 4660c1d13b..7a6eb33b3d 100644 --- a/src/Nancy.Hosting.Self/HostConfiguration.cs +++ b/src/Nancy.Hosting.Self/HostConfiguration.cs @@ -17,6 +17,16 @@ public sealed class HostConfiguration /// public bool RewriteLocalhost { get; set; } + /// + /// Gets or sets a property indicating that + /// should use the weak wildcard (*) instead of the strong wildcard (+). + /// If you use the weak wildcard then Nancy will only receive requests that + /// have not matched any other URL prefix registration, in other words + /// requests that no other application wants to handle. + /// Defaults to false. + /// + public bool UseWeakWildcard { get; set; } + /// /// Configuration around automatically creating URL reservations. /// @@ -98,6 +108,7 @@ private static int ProcessorThreadCount public HostConfiguration() { this.RewriteLocalhost = true; + this.UseWeakWildcard = false; this.UrlReservations = new UrlReservations(); this.AllowChunkedEncoding = true; this.UnhandledExceptionCallback = e => diff --git a/src/Nancy.Hosting.Self/NancyHost.cs b/src/Nancy.Hosting.Self/NancyHost.cs index abbccece7b..b636506916 100644 --- a/src/Nancy.Hosting.Self/NancyHost.cs +++ b/src/Nancy.Hosting.Self/NancyHost.cs @@ -241,7 +241,7 @@ internal IEnumerable GetPrefixes() if (this.configuration.RewriteLocalhost && !baseUri.Host.Contains(".")) { - prefix = prefix.Replace("localhost", "+"); + prefix = prefix.Replace("localhost", this.configuration.UseWeakWildcard ? "*" : "+"); } yield return prefix; diff --git a/test/Nancy.Hosting.Self.Tests/NancySelfHostFixture.cs b/test/Nancy.Hosting.Self.Tests/NancySelfHostFixture.cs index 5ef262b2a3..b0d79d6151 100644 --- a/test/Nancy.Hosting.Self.Tests/NancySelfHostFixture.cs +++ b/test/Nancy.Hosting.Self.Tests/NancySelfHostFixture.cs @@ -248,6 +248,58 @@ public void Should_include_default_port_in_uri_prefixes() prefix.ShouldEqual("http://+:80/"); } + [Fact] + public void Should_use_strong_wildcard_in_url_prefixes_by_default() + { + // Given + var host = new NancyHost( + new HostConfiguration(), + new Uri("http://localhost/") + ); + + // When + var prefix = host.GetPrefixes().Single(); + + // Then + prefix.ShouldStartWith("http://+:"); + } + + [Fact] + public void Should_use_strong_wildcard_in_url_prefixes_when_configured() + { + // Given + var host = new NancyHost( + new HostConfiguration() { + UseWeakWildcard = false, + }, + new Uri("http://localhost/") + ); + + // When + var prefix = host.GetPrefixes().Single(); + + // Then + prefix.ShouldStartWith("http://+:"); + } + + [Fact] + public void Should_use_weak_wildcard_in_url_prefixes_when_configured() + { + // Given + var host = new NancyHost( + new HostConfiguration() { + UseWeakWildcard = true, + }, + new Uri("http://localhost/") + ); + + // When + var prefix = host.GetPrefixes().Single(); + + // Then + prefix.ShouldStartWith("http://*:"); + } + [Fact] public void Should_not_throw_when_disposed_without_starting() {