From 9bccb1fdde912f3342c3f0150ec37753b6980db9 Mon Sep 17 00:00:00 2001 From: Damian Hickey Date: Sun, 1 Nov 2015 16:10:50 +0100 Subject: [PATCH] Delete Hosting.Self projects. Self hosting will be via owin and later hosts. --- src/Nancy.Demo.Hosting.Self/Models/Index.cs | 14 - .../Nancy.Demo.Hosting.Self.csproj | 177 ------- src/Nancy.Demo.Hosting.Self/Program.cs | 30 -- src/Nancy.Demo.Hosting.Self/README.txt | 1 - src/Nancy.Demo.Hosting.Self/TestModule.cs | 45 -- .../Views/FileUpload.spark | 17 - .../Views/staticview.html | 25 - src/Nancy.Demo.Hosting.Self/app.config | 7 - .../IsCaseInstensitiveBaseOfFixture.cs | 185 ------- .../MakeAppLocalPathFixture.cs | 102 ---- .../Nancy.Hosting.Self.Tests.csproj | 173 ------- .../NancySelfHostFixture.cs | 268 ----------- src/Nancy.Hosting.Self.Tests/TestModule.cs | 33 -- src/Nancy.Hosting.Self.Tests/packages.config | 8 - ...cUrlReservationCreationFailureException.cs | 52 -- .../FileSystemRootPathProvider.cs | 17 - src/Nancy.Hosting.Self/HostConfiguration.cs | 70 --- src/Nancy.Hosting.Self/IgnoredHeaders.cs | 34 -- .../Nancy.Hosting.Self.csproj | 161 ------- src/Nancy.Hosting.Self/NancyHost.cs | 451 ------------------ src/Nancy.Hosting.Self/NetSh.cs | 37 -- src/Nancy.Hosting.Self/UacHelper.cs | 39 -- src/Nancy.Hosting.Self/UriExtensions.cs | 129 ----- src/Nancy.Hosting.Self/UrlReservations.cs | 53 -- .../nancy.hosting.self.nuspec | 26 - src/Nancy.sln | 49 -- 26 files changed, 2203 deletions(-) delete mode 100644 src/Nancy.Demo.Hosting.Self/Models/Index.cs delete mode 100644 src/Nancy.Demo.Hosting.Self/Nancy.Demo.Hosting.Self.csproj delete mode 100644 src/Nancy.Demo.Hosting.Self/Program.cs delete mode 100644 src/Nancy.Demo.Hosting.Self/README.txt delete mode 100644 src/Nancy.Demo.Hosting.Self/TestModule.cs delete mode 100644 src/Nancy.Demo.Hosting.Self/Views/FileUpload.spark delete mode 100644 src/Nancy.Demo.Hosting.Self/Views/staticview.html delete mode 100644 src/Nancy.Demo.Hosting.Self/app.config delete mode 100644 src/Nancy.Hosting.Self.Tests/IsCaseInstensitiveBaseOfFixture.cs delete mode 100644 src/Nancy.Hosting.Self.Tests/MakeAppLocalPathFixture.cs delete mode 100644 src/Nancy.Hosting.Self.Tests/Nancy.Hosting.Self.Tests.csproj delete mode 100644 src/Nancy.Hosting.Self.Tests/NancySelfHostFixture.cs delete mode 100644 src/Nancy.Hosting.Self.Tests/TestModule.cs delete mode 100644 src/Nancy.Hosting.Self.Tests/packages.config delete mode 100644 src/Nancy.Hosting.Self/AutomaticUrlReservationCreationFailureException.cs delete mode 100644 src/Nancy.Hosting.Self/FileSystemRootPathProvider.cs delete mode 100644 src/Nancy.Hosting.Self/HostConfiguration.cs delete mode 100644 src/Nancy.Hosting.Self/IgnoredHeaders.cs delete mode 100644 src/Nancy.Hosting.Self/Nancy.Hosting.Self.csproj delete mode 100644 src/Nancy.Hosting.Self/NancyHost.cs delete mode 100644 src/Nancy.Hosting.Self/NetSh.cs delete mode 100644 src/Nancy.Hosting.Self/UacHelper.cs delete mode 100644 src/Nancy.Hosting.Self/UriExtensions.cs delete mode 100644 src/Nancy.Hosting.Self/UrlReservations.cs delete mode 100644 src/Nancy.Hosting.Self/nancy.hosting.self.nuspec diff --git a/src/Nancy.Demo.Hosting.Self/Models/Index.cs b/src/Nancy.Demo.Hosting.Self/Models/Index.cs deleted file mode 100644 index 9c6b413480..0000000000 --- a/src/Nancy.Demo.Hosting.Self/Models/Index.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Nancy.Demo.Hosting.Self.Models -{ - public class Index - { - public string Name { get; set; } - - public string Posted { get; set; } - - public Index() - { - this.Posted = "Nothing :-("; - } - } -} \ No newline at end of file diff --git a/src/Nancy.Demo.Hosting.Self/Nancy.Demo.Hosting.Self.csproj b/src/Nancy.Demo.Hosting.Self/Nancy.Demo.Hosting.Self.csproj deleted file mode 100644 index 01ff356077..0000000000 --- a/src/Nancy.Demo.Hosting.Self/Nancy.Demo.Hosting.Self.csproj +++ /dev/null @@ -1,177 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1} - Exe - Properties - Nancy.Demo.Hosting.Self - Nancy.Demo.Hosting.Self - v4.5 - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - AllRules.ruleset - false - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - AllRules.ruleset - false - - - Nancy.Demo.Hosting.Self.Program - - - true - bin\x86\MonoDebug\ - DEBUG;TRACE - full - x86 - bin\Debug\Nancy.Demo.Hosting.Self.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - AllRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - false - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - false - 4 - false - false - - - bin\x86\MonoRelease\ - TRACE - true - pdbonly - x86 - bin\Release\Nancy.Demo.Hosting.Self.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - AllRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - false - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - false - 4 - false - - - - - - - - - - - - - - - - - - - - Properties\SharedAssemblyInfo.cs - - - - - - - - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134} - Nancy.Hosting.Self - - - {4b7e35df-1569-4346-b180-a09615723095} - Nancy.ViewEngines.Spark - - - {34576216-0DCA-4B0F-A0DC-9075E75A676F} - Nancy - - - - - Designer - - - Designer - Always - - - - - Always - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - \ No newline at end of file diff --git a/src/Nancy.Demo.Hosting.Self/Program.cs b/src/Nancy.Demo.Hosting.Self/Program.cs deleted file mode 100644 index 92cabad650..0000000000 --- a/src/Nancy.Demo.Hosting.Self/Program.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace Nancy.Demo.Hosting.Self -{ - using System; - using System.Diagnostics; - - using Nancy.Hosting.Self; - - class Program - { - static void Main() - { - using (var nancyHost = new NancyHost(new Uri("http://localhost:8888/nancy/"), new Uri("http://127.0.0.1:8898/nancy/"), new Uri("http://localhost:8889/nancytoo/"))) - { - nancyHost.Start(); - - Console.WriteLine("Nancy now listening - navigating to http://localhost:8888/nancy/. Press enter to stop"); - try - { - Process.Start("http://localhost:8888/nancy/"); - } - catch (Exception) - { - } - Console.ReadKey(); - } - - Console.WriteLine("Stopped. Good bye!"); - } - } -} diff --git a/src/Nancy.Demo.Hosting.Self/README.txt b/src/Nancy.Demo.Hosting.Self/README.txt deleted file mode 100644 index 5f282702bb..0000000000 --- a/src/Nancy.Demo.Hosting.Self/README.txt +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Nancy.Demo.Hosting.Self/TestModule.cs b/src/Nancy.Demo.Hosting.Self/TestModule.cs deleted file mode 100644 index 236f732734..0000000000 --- a/src/Nancy.Demo.Hosting.Self/TestModule.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace Nancy.Demo.Hosting.Self -{ - using System.Linq; - - using Nancy.Demo.Hosting.Self.Models; - - public class TestModule : NancyModule - { - public TestModule() - { - Get["/"] = parameters => { - return View["staticview", this.Request.Url]; - }; - - Get["/testing"] = parameters => - { - return View["staticview", this.Request.Url]; - }; - - Get["/fileupload"] = x => - { - var model = new Index() { Name = "Boss Hawg" }; - - return View["FileUpload", model]; - }; - - Post["/fileupload"] = x => - { - var model = new Index() { Name = "Boss Hawg" }; - - var file = this.Request.Files.FirstOrDefault(); - string fileDetails = "None"; - - if (file != null) - { - fileDetails = string.Format("{3} - {0} ({1}) {2}bytes", file.Name, file.ContentType, file.Value.Length, file.Key); - } - - model.Posted = fileDetails; - - return View["FileUpload", model]; - }; - } - } -} \ No newline at end of file diff --git a/src/Nancy.Demo.Hosting.Self/Views/FileUpload.spark b/src/Nancy.Demo.Hosting.Self/Views/FileUpload.spark deleted file mode 100644 index 4fab92d003..0000000000 --- a/src/Nancy.Demo.Hosting.Self/Views/FileUpload.spark +++ /dev/null @@ -1,17 +0,0 @@ - - - - Nancy Self Host Demo - - -

Hello ${Model.Name}!

-

This is a Spark view rendered via the self hosting.

-

You uploaded: ${Model.Posted}

-

-

- - -
-

- - \ No newline at end of file diff --git a/src/Nancy.Demo.Hosting.Self/Views/staticview.html b/src/Nancy.Demo.Hosting.Self/Views/staticview.html deleted file mode 100644 index f7a407d497..0000000000 --- a/src/Nancy.Demo.Hosting.Self/Views/staticview.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - Nancy - Static view served by self-host - - -

Static view served by self-host

-

- This view was served by the Nancy self-host. -

- - http://localhost:8888/nancy/
- http://localhost:8888/nancy/testing
- http://127.0.0.1:8898/nancy/
- http://127.0.0.1:8898/nancy/testing
- http://localhost:8889/nancytoo/
- http://localhost:8889/nancytoo/testing
- - diff --git a/src/Nancy.Demo.Hosting.Self/app.config b/src/Nancy.Demo.Hosting.Self/app.config deleted file mode 100644 index d757e6dc64..0000000000 --- a/src/Nancy.Demo.Hosting.Self/app.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/Nancy.Hosting.Self.Tests/IsCaseInstensitiveBaseOfFixture.cs b/src/Nancy.Hosting.Self.Tests/IsCaseInstensitiveBaseOfFixture.cs deleted file mode 100644 index 95f16caa5a..0000000000 --- a/src/Nancy.Hosting.Self.Tests/IsCaseInstensitiveBaseOfFixture.cs +++ /dev/null @@ -1,185 +0,0 @@ -namespace Nancy.Hosting.Self.Tests -{ - using System; - - using Nancy.Tests; - - using Xunit; - - public class IsCaseInstensitiveBaseOfFixture - { - private readonly Uri baseUri = new Uri("http://host/path/path/file"); - private readonly Uri baseSlashUri = new Uri("http://host/path/path/"); - private readonly Uri baseLocalHostUri = new Uri("http://localhost/path/path/"); - - [Fact] - public void url_should_be_base_of_sub_directory() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path/file/")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_sub_path_with_fragment() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path/file#fragment")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_path_with_more_dirs() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path/file/MoreDir/")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_sub_path_with_file_and_query() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path/file/OtherFile?Query")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_path_with_extra_slash() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path/file/")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_sub_file() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path/file")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_not_be_base_of_other_scheme() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("https://host/path/path/file")); - - // Then - isBaseOf.ShouldBeFalse(); - } - - [Fact] - public void url_should_not_be_base_of_other_host() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("http://otherhost/path/path/file")); - - // Then - isBaseOf.ShouldBeFalse(); - } - - [Fact] - public void url_should_not_be_base_of_other_port() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("http://otherhost:8080/path/path/file")); - - // Then - isBaseOf.ShouldBeFalse(); - } - - [Fact] - public void url_should_be_base_of_host_with_different_casing() - { - // Given, When - var isBaseOf = baseUri.IsCaseInsensitiveBaseOf(new Uri("http://Host/path/path/file")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_exact_path_without_trailing_slash() - { - // Given, When - var isBaseOf = baseSlashUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_exact_path_without_trailing_slash_with_query() - { - // Given, When - var isBaseOf = baseSlashUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path?query")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_exact_path_without_trailing_slash_with_fragment() - { - // Given, When - var isBaseOf = baseSlashUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path#Fragment")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_not_be_base_of_other_path() - { - // Given, When - var isBaseOf = baseSlashUri.IsCaseInsensitiveBaseOf(new Uri("http://host/path/path2/")); - - // Then - isBaseOf.ShouldBeFalse(); - } - - [Fact] - public void url_should_be_base_of_same_path_with_different_host_casing() - { - // Given, When - var isBaseOf = baseSlashUri.IsCaseInsensitiveBaseOf(new Uri("http://Host/path/path/")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_same_path_with_different_path_casing() - { - // Given, When - var isBaseOf = baseSlashUri.IsCaseInsensitiveBaseOf(new Uri("http://host/Path/PATH/")); - - // Then - isBaseOf.ShouldBeTrue(); - } - - [Fact] - public void url_should_be_base_of_same_path_with_different_host_using_localhost_wildcard() - { - // Given, When - var isBaseOf = baseLocalHostUri.IsCaseInsensitiveBaseOf(new Uri("http://OtherHost/path/path/file")); - - // Then - isBaseOf.ShouldBeTrue(); - } - } -} diff --git a/src/Nancy.Hosting.Self.Tests/MakeAppLocalPathFixture.cs b/src/Nancy.Hosting.Self.Tests/MakeAppLocalPathFixture.cs deleted file mode 100644 index 19cdc53fdc..0000000000 --- a/src/Nancy.Hosting.Self.Tests/MakeAppLocalPathFixture.cs +++ /dev/null @@ -1,102 +0,0 @@ -namespace Nancy.Hosting.Self.Tests -{ - using System; - - using Nancy.Tests; - - using Xunit; - - public class MakeAppLocalPathFixture - { - [Fact] - public void Should_return_path_as_local_path() - { - // Given - var uri = new Uri("http://host/base/"); - - // When - string result = uri.MakeAppLocalPath(new Uri("http://host/base/rel")); - - // Then - result.ShouldEqual("/rel"); - } - - [Fact] - public void Should_return_root_path_with_trailing_slash_as_slash() - { - // Given - var uri = new Uri("http://host/base/"); - - // When - string result = uri.MakeAppLocalPath(new Uri("http://host/base/")); - - // Then - result.ShouldEqual("/"); - } - - [Fact] - public void Should_return_root_path_without_trailing_slash_as_slash() - { - // Given - var uri = new Uri("http://host/base/"); - - // When - string result = uri.MakeAppLocalPath(new Uri("http://host/base")); - - // Then - result.ShouldEqual("/"); - } - - [Fact] - public void Should_return_path_with_same_casing_as_full_uri() - { - // Given - var uri = new Uri("http://host/base/"); - - // When - string result = uri.MakeAppLocalPath(new Uri("http://host/base/ReL")); - - // Then - result.ShouldEqual("/ReL"); - } - - [Fact] - public void Should_support_extended_site_root() - { - // Given - var uri = new Uri("http://host/"); - - // When - string result = uri.MakeAppLocalPath(new Uri("http://host/rel/file")); - - // Then - result.ShouldEqual("/rel/file"); - } - - [Fact] - public void Should_support_site_root_without_trailing_slash() - { - // Given - var uri = new Uri("http://host/"); - - // When - string result = uri.MakeAppLocalPath(new Uri("http://host")); - - // Then - result.ShouldEqual("/"); - } - - [Fact] - public void Should_return_path_with_case_insensitive_base_uri_comparison() - { - // Given - var uri = new Uri("http://host/base/"); - - // When - string result = uri.MakeAppLocalPath(new Uri("http://host/Base/rel")); - - // Then - result.ShouldEqual("/rel"); - } - } -} \ No newline at end of file diff --git a/src/Nancy.Hosting.Self.Tests/Nancy.Hosting.Self.Tests.csproj b/src/Nancy.Hosting.Self.Tests/Nancy.Hosting.Self.Tests.csproj deleted file mode 100644 index 1adb443276..0000000000 --- a/src/Nancy.Hosting.Self.Tests/Nancy.Hosting.Self.Tests.csproj +++ /dev/null @@ -1,173 +0,0 @@ - - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8} - Library - Properties - Nancy.Hosting.Self.Tests - Nancy.Hosting.Self.Tests - v4.5 - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - AllRules.ruleset - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - AllRules.ruleset - false - - - true - bin\MonoDebug\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\Nancy.Hosting.Self.Tests.dll.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - AllRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - false - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - false - - - bin\MonoRelease\ - TRACE - true - pdbonly - AnyCPU - bin\Release\Nancy.Hosting.Self.Tests.dll.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - AllRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - false - - - - False - ..\packages\FakeItEasy.1.19.0\lib\net40\FakeItEasy.dll - - - - - - - - - - False - ..\packages\xunit.1.9.1\lib\net20\xunit.dll - - - False - ..\packages\xunit.extensions.1.9.1\lib\net20\xunit.extensions.dll - - - - - ShouldExtensions.cs - - - SkipException.cs - - - SkippableFactAttribute.cs - - - Properties\SharedAssemblyInfo.cs - - - - - - - - - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134} - Nancy.Hosting.Self - - - {34576216-0DCA-4B0F-A0DC-9075E75A676F} - Nancy - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - - - - - - - \ No newline at end of file diff --git a/src/Nancy.Hosting.Self.Tests/NancySelfHostFixture.cs b/src/Nancy.Hosting.Self.Tests/NancySelfHostFixture.cs deleted file mode 100644 index cc058076ef..0000000000 --- a/src/Nancy.Hosting.Self.Tests/NancySelfHostFixture.cs +++ /dev/null @@ -1,268 +0,0 @@ -#if !__MonoCS__ -namespace Nancy.Hosting.Self.Tests -{ - using System; - using System.IO; - using System.Linq; - using System.Net; - using System.Threading; - - using FakeItEasy; - - using Nancy.Bootstrapper; - using Nancy.Helpers; - using Nancy.Tests; - using Nancy.Tests.xUnitExtensions; - - using Xunit; - - /// - /// These tests attempt to listen on port 1234, and so require either administrative - /// privileges or that a command similar to the following has been run with - /// administrative privileges: - /// netsh http add urlacl url=http://+:1234/base user=DOMAIN\user - /// See http://msdn.microsoft.com/en-us/library/ms733768.aspx for more information. - /// - public class NancySelfHostFixture - { - private static readonly Uri BaseUri = new Uri("http://localhost:1234/base/"); - - [SkippableFact] - public void Should_be_get_an_exception_indicating_a_conflict_when_trying_to_listen_on_a_used_prefix() - { - Exception ex; - - // Given - using (CreateAndOpenSelfHost()) - { - // When - ex = Record.Exception(() => - { - using (var host = new NancyHost(BaseUri)) - { - host.Start(); - } - }); - } - - // Then - ex.Message.ShouldContain("conflict"); - } - - [SkippableFact] - public void Should_be_able_to_get_any_header_from_selfhost() - { - // Given - using (CreateAndOpenSelfHost()) - { - // When - var request = WebRequest.Create(new Uri(BaseUri, "rel/header/?query=value")); - request.Method = "GET"; - - // Then - request.GetResponse().Headers["X-Some-Header"].ShouldEqual("Some value"); - } - } - - [SkippableFact] - public void Should_set_query_string_and_uri_correctly() - { - // Given - Request nancyRequest = null; - var fakeEngine = A.Fake(); - A.CallTo(() => fakeEngine.HandleRequest(A.Ignored, A>.Ignored,A.Ignored)) - .Invokes(f => nancyRequest = (Request)f.Arguments[0]) - .ReturnsLazily(c => TaskHelpers.GetCompletedTask(new NancyContext { Request = (Request)c.Arguments[0], Response = new Response() })); - - var fakeBootstrapper = A.Fake(); - A.CallTo(() => fakeBootstrapper.GetEngine()).Returns(fakeEngine); - - // When - using (CreateAndOpenSelfHost(fakeBootstrapper)) - { - var request = WebRequest.Create(new Uri(BaseUri, "test/stuff?query=value&query2=value2")); - request.Method = "GET"; - - try - { - request.GetResponse(); - } - catch (WebException) - { - // Will throw because it returns 404 - don't care. - } - } - - // Then - nancyRequest.Path.ShouldEqual("/test/stuff"); - Assert.True(nancyRequest.Query.query.HasValue); - Assert.True(nancyRequest.Query.query2.HasValue); - } - - [SkippableFact] - public void Should_be_able_to_get_from_selfhost() - { - using (CreateAndOpenSelfHost()) - { - var reader = - new StreamReader(WebRequest.Create(new Uri(BaseUri, "rel")).GetResponse().GetResponseStream()); - - var response = reader.ReadToEnd(); - - response.ShouldEqual("This is the site route"); - } - } - - [SkippableFact] - public void Should_be_able_to_get_from_chunked_selfhost() - { - using (CreateAndOpenSelfHost()) - { - var response = WebRequest.Create(new Uri(BaseUri, "rel")).GetResponse(); - - Assert.Equal("chunked", response.Headers["Transfer-Encoding"]); - Assert.Equal(null, response.Headers["Content-Length"]); - - using (var reader = new StreamReader(response.GetResponseStream())) - { - var contents = reader.ReadToEnd(); - contents.ShouldEqual("This is the site route"); - } - } - } - - [SkippableFact] - public void Should_be_able_to_get_from_contentlength_selfhost() - { - HostConfiguration configuration = new HostConfiguration() - { - AllowChunkedEncoding = false - }; - using (CreateAndOpenSelfHost(null, configuration)) - { - var response = WebRequest.Create(new Uri(BaseUri, "rel")).GetResponse(); - - Assert.Equal(null, response.Headers["Transfer-Encoding"]); - Assert.Equal(22, Convert.ToInt32(response.Headers["Content-Length"])); - - using (var reader = new StreamReader(response.GetResponseStream())) - { - var contents = reader.ReadToEnd(); - contents.ShouldEqual("This is the site route"); - } - } - } - - [SkippableFact] - public void Should_be_able_to_post_body_to_selfhost() - { - using (CreateAndOpenSelfHost()) - { - const string testBody = "This is the body of the request"; - - var request = - WebRequest.Create(new Uri(BaseUri, "rel")); - request.Method = "POST"; - - var writer = - new StreamWriter(request.GetRequestStream()) { AutoFlush = true }; - writer.Write(testBody); - - var responseBody = - new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd(); - - responseBody.ShouldEqual(testBody); - } - } - - [SkippableFact] - public void Should_be_able_to_get_from_selfhost_with_slashless_uri() - { - using (CreateAndOpenSelfHost()) - { - var reader = - new StreamReader(WebRequest.Create(BaseUri.ToString().TrimEnd('/')).GetResponse().GetResponseStream()); - - var response = reader.ReadToEnd(); - - response.ShouldEqual("This is the site home"); - } - } - - private static NancyHostWrapper CreateAndOpenSelfHost(INancyBootstrapper nancyBootstrapper = null, HostConfiguration configuration = null) - { - if (nancyBootstrapper == null) - { - nancyBootstrapper = new DefaultNancyBootstrapper(); - } - - var host = new NancyHost( - nancyBootstrapper, - configuration, - BaseUri); - - try - { - host.Start(); - } - catch - { - throw new SkipException("Skipped due to no Administrator access - please see test fixture for more information."); - } - - return new NancyHostWrapper(host); - } - - - [SkippableFact] - public void Should_be_able_to_recover_from_rendering_exception() - { - using (CreateAndOpenSelfHost()) - { - - var reader = - new StreamReader(WebRequest.Create(new Uri(BaseUri, "exception")).GetResponse().GetResponseStream()); - - var response = reader.ReadToEnd(); - - response.ShouldEqual("Content"); - } - } - - [SkippableFact] - public void Should_be_serializable() - { - var type = typeof(NancyHost); - Assert.True(type.Attributes.ToString().Contains("Serializable")); - } - - [Fact] - public void Should_include_default_port_in_uri_prefixes() - { - // Given - var host = new NancyHost(new Uri("http://localhost/")); - - // When - var prefix = host.GetPrefixes().Single(); - - // Then - prefix.ShouldEqual("http://+:80/"); - } - - private class NancyHostWrapper : IDisposable - { - private readonly NancyHost host; - - public NancyHostWrapper(NancyHost host) - { - this.host = host; - } - - public void Dispose() - { - host.Stop(); - } - } - } -} -#endif diff --git a/src/Nancy.Hosting.Self.Tests/TestModule.cs b/src/Nancy.Hosting.Self.Tests/TestModule.cs deleted file mode 100644 index 463fb0eb32..0000000000 --- a/src/Nancy.Hosting.Self.Tests/TestModule.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace Nancy.Hosting.Self.Tests -{ - using System; - using System.IO; - - public class TestModule : NancyModule - { - public TestModule() - { - Get["/"] = parameters => "This is the site home"; - - Get["/rel"] = parameters => "This is the site route"; - - Get["/rel/header"] = parameters => - { - var response = new Response(); - response.Headers["X-Some-Header"] = "Some value"; - - return response; - }; - - Post["/rel"] = parameters => new StreamReader(this.Request.Body).ReadToEnd(); - - Get["/exception"] = parameters => new Response() {Contents = s => - { - var writer = new StreamWriter(s); - writer.Write("Content"); - writer.Flush(); - throw new Exception("An error occured during content rendering"); - }}; - } - } -} \ No newline at end of file diff --git a/src/Nancy.Hosting.Self.Tests/packages.config b/src/Nancy.Hosting.Self.Tests/packages.config deleted file mode 100644 index 18f13949c6..0000000000 --- a/src/Nancy.Hosting.Self.Tests/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/Nancy.Hosting.Self/AutomaticUrlReservationCreationFailureException.cs b/src/Nancy.Hosting.Self/AutomaticUrlReservationCreationFailureException.cs deleted file mode 100644 index f54c1f59f5..0000000000 --- a/src/Nancy.Hosting.Self/AutomaticUrlReservationCreationFailureException.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace Nancy.Hosting.Self -{ - using System; - using System.Collections.Generic; - using System.Text; - - /// - /// Exception for when automatic address reservation creation fails. - /// Provides the user with manual instructions. - /// - public class AutomaticUrlReservationCreationFailureException : Exception - { - private readonly IEnumerable prefixes; - private readonly string user; - - public AutomaticUrlReservationCreationFailureException(IEnumerable prefixes, string user) - { - this.prefixes = prefixes; - this.user = user; - } - - /// - /// Gets a message that describes the current exception. - /// - /// - /// The error message that explains the reason for the exception, or an empty string(""). - /// - /// 1 - public override string Message - { - get - { - var stringBuilder = new StringBuilder(); - - stringBuilder.AppendLine("The Nancy self host was unable to start, as no namespace reservation existed for the provided url(s)."); - stringBuilder.AppendLine(); - - stringBuilder.AppendLine("Please either enable UrlReservations.CreateAutomatically on the HostConfiguration provided to "); - stringBuilder.AppendLine("the NancyHost, or create the reservations manually with the (elevated) command(s):"); - stringBuilder.AppendLine(); - - foreach (var prefix in prefixes) - { - var command = NetSh.GetParameters(prefix, user); - stringBuilder.AppendLine(string.Format("netsh {0}", command)); - } - - return stringBuilder.ToString(); - } - } - } -} diff --git a/src/Nancy.Hosting.Self/FileSystemRootPathProvider.cs b/src/Nancy.Hosting.Self/FileSystemRootPathProvider.cs deleted file mode 100644 index 9fbf119cdb..0000000000 --- a/src/Nancy.Hosting.Self/FileSystemRootPathProvider.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Nancy.Hosting.Self -{ - using System.IO; - using System.Reflection; - - public class FileSystemRootPathProvider : IRootPathProvider - { - public string GetRootPath() - { - var assembly = Assembly.GetEntryAssembly(); - - return assembly != null ? - Path.GetDirectoryName(assembly.Location) : - Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - } - } -} diff --git a/src/Nancy.Hosting.Self/HostConfiguration.cs b/src/Nancy.Hosting.Self/HostConfiguration.cs deleted file mode 100644 index 1007cf193a..0000000000 --- a/src/Nancy.Hosting.Self/HostConfiguration.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace Nancy.Hosting.Self -{ - using System; - using System.Diagnostics; - - /// - /// Host configuration for the self host - /// - public sealed class HostConfiguration - { - /// - /// Gets or sets a property that determines if localhost uris are - /// rewritten to htp://+:port/ style uris to allow for listening on - /// all ports, but requiring either a url reservation, or admin - /// access - /// Defaults to true. - /// - public bool RewriteLocalhost { get; set; } - - /// - /// Configuration around automatically creating url reservations - /// - public UrlReservations UrlReservations { get; set; } - - /// - /// Gets or sets a property that determines if Transfer-Encoding: Chunked is allowed - /// for the response instead of Content-Length (default: true). - /// - public bool AllowChunkedEncoding { get; set; } - - /// - /// Gets or sets a property that provides a callback to be called - /// if there's an unhandled exception in the self host. - /// Note: this will *not* be called for normal nancy Exceptions - /// that are handled by the Nancy handlers. - /// Defaults to writing to debug out. - /// - public Action UnhandledExceptionCallback { get; set; } - - /// - /// Gets or sets a property that determines whether client certificates - /// are enabled or not. - /// When set to true the self host will request a client certificate if the - /// request is running over SSL. - /// Defaults to false. - /// - public bool EnableClientCertificates { get; set; } - - /// - /// Gets or sets a property determining if base uri matching can fall back to just - /// using Authority (Schema + Host + Port) as base uri if it cannot match anything in - /// the known list. This should only be set to True if you have issues with port forwarding - /// (e.g. on Azure). - /// - public bool AllowAuthorityFallback { get; set; } - - public HostConfiguration() - { - this.RewriteLocalhost = true; - this.UrlReservations = new UrlReservations(); - this.AllowChunkedEncoding = true; - this.UnhandledExceptionCallback = e => - { - var message = string.Format("---\n{0}\n---\n", e); - Debug.Write(message); - }; - this.EnableClientCertificates = false; - } - } -} diff --git a/src/Nancy.Hosting.Self/IgnoredHeaders.cs b/src/Nancy.Hosting.Self/IgnoredHeaders.cs deleted file mode 100644 index 4a6ea2da69..0000000000 --- a/src/Nancy.Hosting.Self/IgnoredHeaders.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace Nancy.Hosting.Self -{ - using System; - using System.Collections.Generic; - - /// - /// A helper class that checks for a header against a list of headers that should be ignored - /// when populating the headers of an object. - /// - public static class IgnoredHeaders - { - - private static readonly HashSet knownHeaders = new HashSet(StringComparer.OrdinalIgnoreCase) - { - "content-length", - "content-type", - "transfer-encoding", - "keep-alive" - }; - - /// - /// Determines if a header is ignored when populating the headers of an - /// object. - /// - /// The name of the header. - /// true if the header is ignored; otherwise, false. - public static bool IsIgnored(string headerName) - { - return knownHeaders.Contains(headerName); - } - - } - -} diff --git a/src/Nancy.Hosting.Self/Nancy.Hosting.Self.csproj b/src/Nancy.Hosting.Self/Nancy.Hosting.Self.csproj deleted file mode 100644 index 8ded63f0c9..0000000000 --- a/src/Nancy.Hosting.Self/Nancy.Hosting.Self.csproj +++ /dev/null @@ -1,161 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134} - Library - Properties - Nancy.Hosting.Self - Nancy.Hosting.Self - v4.5 - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - AllRules.ruleset - bin\Debug\Nancy.Hosting.Self.XML - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - AllRules.ruleset - bin\Release\Nancy.Hosting.Self.XML - false - - - true - bin\MonoDebug\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\Nancy.Hosting.Self.dll.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - AllRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - false - false - 4 - false - bin\MonoDebug\Nancy.Hosting.Self.XML - false - - - bin\MonoRelease\ - TRACE - true - pdbonly - AnyCPU - bin\Release\Nancy.Hosting.Self.dll.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - AllRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - 4 - bin\MonoRelease\Nancy.Hosting.Self.XML - false - - - - - - - - - - - - - - - - - - - - Properties\SharedAssemblyInfo.cs - - - - - - - - - - - Code - - - - - {34576216-0DCA-4B0F-A0DC-9075E75A676F} - Nancy - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - \ No newline at end of file diff --git a/src/Nancy.Hosting.Self/NancyHost.cs b/src/Nancy.Hosting.Self/NancyHost.cs deleted file mode 100644 index 314c5aed4d..0000000000 --- a/src/Nancy.Hosting.Self/NancyHost.cs +++ /dev/null @@ -1,451 +0,0 @@ -namespace Nancy.Hosting.Self -{ - using System; - using System.Collections.Generic; - using System.Globalization; - using System.IO; - using System.Linq; - using System.Net; - using System.Security.Principal; - - using Nancy.Bootstrapper; - using Nancy.Extensions; - using Nancy.Helpers; - using Nancy.IO; - - /// - /// Allows to host Nancy server inside any application - console or windows service. - /// - /// - /// NancyHost uses internally. Therefore, it requires full .net 4.0 profile (not client profile) - /// to run. will launch a thread that will listen for requests and then process them. Each request is processed in - /// its own execution thread. NancyHost needs in order to be used from another appdomain under - /// mono. Working with AppDomains is necessary if you want to unload the dependencies that come with NancyHost. - /// - [Serializable] - public class NancyHost : IDisposable - { - private const int ACCESS_DENIED = 5; - - private readonly IList baseUriList; - private HttpListener listener; - private readonly INancyEngine engine; - private readonly HostConfiguration configuration; - private readonly INancyBootstrapper bootstrapper; - - /// - /// Initializes a new instance of the class for the specified . - /// Uses the default configuration - /// - /// The s that the host will listen to. - public NancyHost(params Uri[] baseUris) - : this(NancyBootstrapperLocator.Bootstrapper, new HostConfiguration(), baseUris) { } - - /// - /// Initializes a new instance of the class for the specified . - /// Uses the specified configuration. - /// - /// The s that the host will listen to. - /// Configuration to use - public NancyHost(HostConfiguration configuration, params Uri[] baseUris) - : this(NancyBootstrapperLocator.Bootstrapper, configuration, baseUris){} - - /// - /// Initializes a new instance of the class for the specified , using - /// the provided . - /// Uses the default configuration - /// - /// The bootstrapper that should be used to handle the request. - /// The s that the host will listen to. - public NancyHost(INancyBootstrapper bootstrapper, params Uri[] baseUris) - : this(bootstrapper, new HostConfiguration(), baseUris) - { - } - - /// - /// Initializes a new instance of the class for the specified , using - /// the provided . - /// Uses the specified configuration. - /// - /// The bootstrapper that should be used to handle the request. - /// Configuration to use - /// The s that the host will listen to. - public NancyHost(INancyBootstrapper bootstrapper, HostConfiguration configuration, params Uri[] baseUris) - { - this.bootstrapper = bootstrapper; - this.configuration = configuration ?? new HostConfiguration(); - this.baseUriList = baseUris; - - bootstrapper.Initialise(); - this.engine = bootstrapper.GetEngine(); - } - - /// - /// Initializes a new instance of the class for the specified , using - /// the provided . - /// Uses the default configuration - /// - /// The that the host will listen to. - /// The bootstrapper that should be used to handle the request. - public NancyHost(Uri baseUri, INancyBootstrapper bootstrapper) - : this(bootstrapper, new HostConfiguration(), baseUri) - { - } - - /// - /// Initializes a new instance of the class for the specified , using - /// the provided . - /// Uses the specified configuration. - /// - /// The that the host will listen to. - /// The bootstrapper that should be used to handle the request. - /// Configuration to use - public NancyHost(Uri baseUri, INancyBootstrapper bootstrapper, HostConfiguration configuration) - : this (bootstrapper, configuration, baseUri) - { - } - - /// - /// Stops the host if it is running. - /// - public void Dispose() - { - this.Stop(); - - this.bootstrapper.Dispose(); - } - - /// - /// Start listening for incoming requests with the given configuration - /// - public void Start() - { - this.StartListener(); - - try - { - this.listener.BeginGetContext(this.GotCallback, null); - } - catch (Exception e) - { - this.configuration.UnhandledExceptionCallback.Invoke(e); - - throw; - } - } - - private void StartListener() - { - if (this.TryStartListener()) - { - return; - } - - if (!this.configuration.UrlReservations.CreateAutomatically) - { - throw new AutomaticUrlReservationCreationFailureException(this.GetPrefixes(), this.GetUser()); - } - - if (!this.TryAddUrlReservations()) - { - throw new InvalidOperationException("Unable to configure namespace reservation"); - } - - if (!TryStartListener()) - { - throw new InvalidOperationException("Unable to start listener"); - } - } - - private bool TryStartListener() - { - try - { - // if the listener fails to start, it gets disposed; - // so we need a new one, each time. - this.listener = new HttpListener(); - foreach (var prefix in this.GetPrefixes()) - { - this.listener.Prefixes.Add(prefix); - } - - this.listener.Start(); - - return true; - } - catch (HttpListenerException e) - { - if (e.ErrorCode == ACCESS_DENIED) - { - return false; - } - - throw; - } - } - - private bool TryAddUrlReservations() - { - var user = this.GetUser(); - - foreach (var prefix in this.GetPrefixes()) - { - if (!NetSh.AddUrlAcl(prefix, user)) - { - return false; - } - } - - return true; - } - - private string GetUser() - { - if (!string.IsNullOrWhiteSpace(this.configuration.UrlReservations.User)) - { - return this.configuration.UrlReservations.User; - } - - return WindowsIdentity.GetCurrent().Name; - } - - /// - /// Stop listening for incoming requests. - /// - public void Stop() - { - if (this.listener.IsListening) - { - listener.Stop(); - } - } - - internal IEnumerable GetPrefixes() - { - foreach (var baseUri in this.baseUriList) - { - var prefix = new UriBuilder(baseUri).ToString(); - - if (this.configuration.RewriteLocalhost && !baseUri.Host.Contains(".")) - { - prefix = prefix.Replace("localhost", "+"); - } - - yield return prefix; - } - } - - private Request ConvertRequestToNancyRequest(HttpListenerRequest request) - { - var baseUri = this.GetBaseUri(request); - - if (baseUri == null) - { - throw new InvalidOperationException(String.Format("Unable to locate base URI for request: {0}",request.Url)); - } - - var expectedRequestLength = - GetExpectedRequestLength(request.Headers.ToDictionary()); - - var relativeUrl = baseUri.MakeAppLocalPath(request.Url); - - var nancyUrl = new Url - { - Scheme = request.Url.Scheme, - HostName = request.Url.Host, - Port = request.Url.IsDefaultPort ? null : (int?)request.Url.Port, - BasePath = baseUri.AbsolutePath.TrimEnd('/'), - Path = HttpUtility.UrlDecode(relativeUrl), - Query = request.Url.Query, - }; - - byte[] certificate = null; - - if (this.configuration.EnableClientCertificates) - { - var x509Certificate = request.GetClientCertificate(); - - if (x509Certificate != null) - { - certificate = x509Certificate.RawData; - } - } - - // NOTE: For HTTP/2 we want fieldCount = 1, - // otherwise (HTTP/1.0 and HTTP/1.1) we want fieldCount = 2 - var fieldCount = request.ProtocolVersion.Major == 2 ? 1 : 2; - - var protocolVersion = string.Format("HTTP/{0}", request.ProtocolVersion.ToString(fieldCount)); - - return new Request( - request.HttpMethod, - nancyUrl, - RequestStream.FromStream(request.InputStream, expectedRequestLength, StaticConfiguration.DisableRequestStreamSwitching ?? false), - request.Headers.ToDictionary(), - (request.RemoteEndPoint != null) ? request.RemoteEndPoint.Address.ToString() : null, - certificate, - protocolVersion); - } - - private Uri GetBaseUri(HttpListenerRequest request) - { - var result = this.baseUriList.FirstOrDefault(uri => uri.IsCaseInsensitiveBaseOf(request.Url)); - - if (result != null) - { - return result; - } - - if (!this.configuration.AllowAuthorityFallback) - { - return null; - } - - return new Uri(request.Url.GetLeftPart(UriPartial.Authority)); - } - - private void ConvertNancyResponseToResponse(Response nancyResponse, HttpListenerResponse response) - { - foreach (var header in nancyResponse.Headers) - { - if (!IgnoredHeaders.IsIgnored(header.Key)) - { - response.AddHeader(header.Key, header.Value); - } - } - - foreach (var nancyCookie in nancyResponse.Cookies) - { - response.Headers.Add(HttpResponseHeader.SetCookie, nancyCookie.ToString()); - } - - if (nancyResponse.ReasonPhrase != null) - { - response.StatusDescription = nancyResponse.ReasonPhrase; - } - - if (nancyResponse.ContentType != null) - { - response.ContentType = nancyResponse.ContentType; - } - - response.StatusCode = (int)nancyResponse.StatusCode; - - if (configuration.AllowChunkedEncoding) - { - OutputWithDefaultTransferEncoding(nancyResponse, response); - } - else - { - OutputWithContentLength(nancyResponse, response); - } - } - - private static void OutputWithDefaultTransferEncoding(Response nancyResponse, HttpListenerResponse response) - { - using (var output = response.OutputStream) - { - nancyResponse.Contents.Invoke(output); - } - } - - private static void OutputWithContentLength(Response nancyResponse, HttpListenerResponse response) - { - byte[] buffer; - using (var memoryStream = new MemoryStream()) - { - nancyResponse.Contents.Invoke(memoryStream); - buffer = memoryStream.ToArray(); - } - - var contentLength = (nancyResponse.Headers.ContainsKey("Content-Length")) ? - Convert.ToInt64(nancyResponse.Headers["Content-Length"]) : - buffer.Length; - - response.SendChunked = false; - response.ContentLength64 = contentLength; - - using (var output = response.OutputStream) - { - using (var writer = new BinaryWriter(output)) - { - writer.Write(buffer); - writer.Flush(); - } - } - } - - private static long GetExpectedRequestLength(IDictionary> incomingHeaders) - { - if (incomingHeaders == null) - { - return 0; - } - - if (!incomingHeaders.ContainsKey("Content-Length")) - { - return 0; - } - - var headerValue = - incomingHeaders["Content-Length"].SingleOrDefault(); - - if (headerValue == null) - { - return 0; - } - - long contentLength; - - return !long.TryParse(headerValue, NumberStyles.Any, CultureInfo.InvariantCulture, out contentLength) ? - 0 : - contentLength; - } - - private void GotCallback(IAsyncResult ar) - { - try - { - var ctx = this.listener.EndGetContext(ar); - this.listener.BeginGetContext(this.GotCallback, null); - this.Process(ctx); - } - catch (Exception e) - { - this.configuration.UnhandledExceptionCallback.Invoke(e); - - try - { - this.listener.BeginGetContext(this.GotCallback, null); - } - catch - { - this.configuration.UnhandledExceptionCallback.Invoke(e); - } - } - } - - private void Process(HttpListenerContext ctx) - { - try - { - var nancyRequest = this.ConvertRequestToNancyRequest(ctx.Request); - using (var nancyContext = this.engine.HandleRequest(nancyRequest)) - { - try - { - ConvertNancyResponseToResponse(nancyContext.Response, ctx.Response); - } - catch (Exception e) - { - this.configuration.UnhandledExceptionCallback.Invoke(e); - } - } - } - catch (Exception e) - { - this.configuration.UnhandledExceptionCallback.Invoke(e); - } - } - } -} diff --git a/src/Nancy.Hosting.Self/NetSh.cs b/src/Nancy.Hosting.Self/NetSh.cs deleted file mode 100644 index b86d45ce1c..0000000000 --- a/src/Nancy.Hosting.Self/NetSh.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace Nancy.Hosting.Self -{ - using System; - - /// - /// Executes NetSh commands - /// - public static class NetSh - { - private const string NetshCommand = "netsh"; - - /// - /// Add a url reservation - /// - /// Url to add - /// User to add the reservation for - /// True if successful, false otherwise. - public static bool AddUrlAcl(string url, string user) - { - try - { - var arguments = GetParameters(url, user); - - return UacHelper.RunElevated(NetshCommand, arguments); - } - catch (Exception) - { - return false; - } - } - - internal static string GetParameters(string url, string user) - { - return string.Format("http add urlacl url=\"{0}\" user=\"{1}\"", url, user); - } - } -} \ No newline at end of file diff --git a/src/Nancy.Hosting.Self/UacHelper.cs b/src/Nancy.Hosting.Self/UacHelper.cs deleted file mode 100644 index 62c1c296d2..0000000000 --- a/src/Nancy.Hosting.Self/UacHelper.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace Nancy.Hosting.Self -{ - using System.Diagnostics; - - /// - /// Helpers for UAC - /// - public static class UacHelper - { - /// - /// Run an executable elevated - /// - /// File to execute - /// Arguments to pass to the executable - /// True if successful, false otherwise - public static bool RunElevated(string file, string args) - { - var process = CreateProcess(args, file); - - process.Start(); - process.WaitForExit(); - - return process.ExitCode == 0; - } - - private static Process CreateProcess(string args, string file) - { - return new Process - { - StartInfo = new ProcessStartInfo - { - Verb = "runas", - Arguments = args, - FileName = file, - } - }; - } - } -} \ No newline at end of file diff --git a/src/Nancy.Hosting.Self/UriExtensions.cs b/src/Nancy.Hosting.Self/UriExtensions.cs deleted file mode 100644 index a7e0ca7fdf..0000000000 --- a/src/Nancy.Hosting.Self/UriExtensions.cs +++ /dev/null @@ -1,129 +0,0 @@ -namespace Nancy.Hosting.Self -{ - using System; - using System.Collections.Generic; - using System.Text; - - /// - /// Extension methods for working with instances. - /// - public static class UriExtensions - { - public static bool IsCaseInsensitiveBaseOf(this Uri source, Uri value) - { - var uriComponents = source.Host == "localhost" ? (UriComponents.Port | UriComponents.Scheme) : (UriComponents.HostAndPort | UriComponents.Scheme); - if (Uri.Compare(source, value, uriComponents, UriFormat.Unescaped, StringComparison.OrdinalIgnoreCase) != 0) - { - return false; - } - - var sourceSegments = source.Segments; - var valueSegments = value.Segments; - - return sourceSegments.ZipCompare(valueSegments, (s1, s2) => s1.Length == 0 || SegmentEquals(s1, s2)); - } - - public static string MakeAppLocalPath(this Uri appBaseUri, Uri fullUri) - { - return string.Concat("/", appBaseUri.Segments.ZipFill(fullUri.Segments, (x, y) => x != null && SegmentEquals(x, y) ? null : y).Join()); - } - - private static string AppendSlashIfNeeded(string segment) - { - if (!segment.EndsWith("/")) - { - segment = string.Concat(segment, "/"); - } - - return segment; - } - - private static bool SegmentEquals(string segment1, string segment2) - { - return String.Equals(AppendSlashIfNeeded(segment1), AppendSlashIfNeeded(segment2), StringComparison.OrdinalIgnoreCase); - } - - private static bool ZipCompare(this IEnumerable source1, IEnumerable source2, Func comparison) - { - using (var enumerator1 = source1.GetEnumerator()) - { - using (var enumerator2 = source2.GetEnumerator()) - { - var has1 = enumerator1.MoveNext(); - var has2 = enumerator2.MoveNext(); - - while (has1 || has2) - { - var current1 = has1 ? enumerator1.Current : ""; - var current2 = has2 ? enumerator2.Current : ""; - - if (!comparison(current1, current2)) - { - return false; - } - - if (has1) - { - has1 = enumerator1.MoveNext(); - } - - if (has2) - { - has2 = enumerator2.MoveNext(); - } - } - - } - } - - return true; - } - - private static IEnumerable ZipFill(this IEnumerable source1, IEnumerable source2, Func selector) - { - using (var enumerator1 = source1.GetEnumerator()) - { - using (var enumerator2 = source2.GetEnumerator()) - { - var has1 = enumerator1.MoveNext(); - var has2 = enumerator2.MoveNext(); - - while (has1 || has2) - { - var value1 = has1 ? enumerator1.Current : null; - var value2 = has2 ? enumerator2.Current : null; - var value = selector(value1, value2); - - if (value != null) - { - yield return value; - } - - if (has1) - { - has1 = enumerator1.MoveNext(); - } - - if (has2) - { - has2 = enumerator2.MoveNext(); - } - } - - } - } - } - - private static string Join(this IEnumerable source) - { - var builder = new StringBuilder(); - - foreach (var value in source) - { - builder.Append(value); - } - - return builder.ToString(); - } - } -} diff --git a/src/Nancy.Hosting.Self/UrlReservations.cs b/src/Nancy.Hosting.Self/UrlReservations.cs deleted file mode 100644 index 5ed49734f7..0000000000 --- a/src/Nancy.Hosting.Self/UrlReservations.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace Nancy.Hosting.Self -{ - using System; - using System.Security.Principal; - - /// - /// Configuration for automatic url reservation creation - /// - public class UrlReservations - { - private const string EveryoneAccountName = "Everyone"; - - private static readonly IdentityReference EveryoneReference = - new SecurityIdentifier(WellKnownSidType.WorldSid, null); - - public UrlReservations() - { - this.CreateAutomatically = false; - this.User = GetEveryoneAccountName(); - } - - /// - /// Gets or sets a value indicating whether url reservations - /// are automatically created when necessary. - /// Defaults to false. - /// - public bool CreateAutomatically { get; set; } - - /// - /// Gets or sets a value for the user to use to create the url reservations for. - /// Defaults to the "Everyone" group. - /// - public string User { get; set; } - - private static string GetEveryoneAccountName() - { - try - { - var account = EveryoneReference.Translate(typeof(NTAccount)) as NTAccount; - if (account != null) - { - return account.Value; - } - - return EveryoneAccountName; - } - catch (Exception) - { - return EveryoneAccountName; - } - } - } -} \ No newline at end of file diff --git a/src/Nancy.Hosting.Self/nancy.hosting.self.nuspec b/src/Nancy.Hosting.Self/nancy.hosting.self.nuspec deleted file mode 100644 index e6de7acd6b..0000000000 --- a/src/Nancy.Hosting.Self/nancy.hosting.self.nuspec +++ /dev/null @@ -1,26 +0,0 @@ - - - - Nancy.Hosting.Self - 0.0.0 - Andreas Håkansson, Steven Robbins and contributors - false - Enables hosting Nancy in any application. - Nancy is a lightweight web framework for the .Net platform, inspired by Sinatra. Nancy aim at delivering a low ceremony approach to building light, fast web applications. - en-US - Andreas Håkansson, Steven Robbins and contributors - http://nancyfx.org/nancy-nuget.png - https://github.com/NancyFx/Nancy/blob/master/license.txt - http://nancyfx.org - - - - Nancy - - - - - - - - \ No newline at end of file diff --git a/src/Nancy.sln b/src/Nancy.sln index c207c992ff..a10fe748de 100644 --- a/src/Nancy.sln +++ b/src/Nancy.sln @@ -21,8 +21,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Hosting.Aspnet", "Nan EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Authentication.Forms", "Nancy.Authentication.Forms\Nancy.Authentication.Forms.csproj", "{E8B18958-7C8A-4FBA-AF00-3041C34A20CE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Hosting.Self", "Nancy.Hosting.Self\Nancy.Hosting.Self.csproj", "{AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Testing", "Nancy.Testing\Nancy.Testing.csproj", "{D79203C0-B672-4751-9C95-C3AB7D3FEFBE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.ViewEngines.DotLiquid", "Nancy.ViewEngines.DotLiquid\Nancy.ViewEngines.DotLiquid.csproj", "{B795886D-9D70-45B1-BFB5-AD54CBC9A447}" @@ -55,8 +53,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Demo.Bootstrapping.As EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Demo.Caching", "Nancy.Demo.Caching\Nancy.Demo.Caching.csproj", "{28F9EA8B-90F7-4974-BB40-0B7FA9309D02}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Demo.Hosting.Self", "Nancy.Demo.Hosting.Self\Nancy.Demo.Hosting.Self.csproj", "{0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Demo.Hosting.Aspnet", "Nancy.Demo.Hosting.Aspnet\Nancy.Demo.Hosting.Aspnet.csproj", "{E127FED3-01C0-41BA-BF83-D8DCDD827D6A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Demo.Authentication.Forms.TestingDemo", "Nancy.Demo.Authentication.Forms.TestingDemo\Nancy.Demo.Authentication.Forms.TestingDemo.csproj", "{948A8EF6-D50C-45EA-9AFD-7A4723ADAB0B}" @@ -85,8 +81,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.ViewEngines.Razor.Tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.ViewEngines.Razor.BuildProviders", "Nancy.ViewEngines.Razor.BuildProviders\Nancy.ViewEngines.Razor.BuildProviders.csproj", "{EDF3E264-2D0F-4440-99FF-45D279A598A9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Hosting.Self.Tests", "Nancy.Hosting.Self.Tests\Nancy.Hosting.Self.Tests.csproj", "{CA24ED85-DD68-4C10-B80A-D81C6745FCB8}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Authentication.Stateless", "Nancy.Authentication.Stateless\Nancy.Authentication.Stateless.csproj", "{211560C3-FDDF-46D6-AB0C-F3BC04B173B5}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nancy.Demo.Authentication.Stateless.Website", "Nancy.Demo.Authentication.Stateless.Website\Nancy.Demo.Authentication.Stateless.Website.csproj", "{B5E3586D-81DE-49C3-83BC-062684795127}" @@ -195,18 +189,6 @@ Global {E8B18958-7C8A-4FBA-AF00-3041C34A20CE}.Release|Any CPU.ActiveCfg = Release|Any CPU {E8B18958-7C8A-4FBA-AF00-3041C34A20CE}.Release|Any CPU.Build.0 = Release|Any CPU {E8B18958-7C8A-4FBA-AF00-3041C34A20CE}.Release|x86.ActiveCfg = Release|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.Debug|x86.ActiveCfg = Debug|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.MonoDebug|Any CPU.ActiveCfg = MonoDebug|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.MonoDebug|Any CPU.Build.0 = MonoDebug|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.MonoDebug|x86.ActiveCfg = MonoDebug|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.MonoRelease|Any CPU.ActiveCfg = MonoRelease|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.MonoRelease|Any CPU.Build.0 = MonoRelease|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.MonoRelease|x86.ActiveCfg = MonoRelease|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.Release|Any CPU.Build.0 = Release|Any CPU - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134}.Release|x86.ActiveCfg = Release|Any CPU {D79203C0-B672-4751-9C95-C3AB7D3FEFBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D79203C0-B672-4751-9C95-C3AB7D3FEFBE}.Debug|Any CPU.Build.0 = Debug|Any CPU {D79203C0-B672-4751-9C95-C3AB7D3FEFBE}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -397,22 +379,6 @@ Global {28F9EA8B-90F7-4974-BB40-0B7FA9309D02}.Release|Any CPU.ActiveCfg = Release|Any CPU {28F9EA8B-90F7-4974-BB40-0B7FA9309D02}.Release|Any CPU.Build.0 = Release|Any CPU {28F9EA8B-90F7-4974-BB40-0B7FA9309D02}.Release|x86.ActiveCfg = Release|Any CPU - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.Debug|Any CPU.ActiveCfg = Debug|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.Debug|Any CPU.Build.0 = Debug|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.Debug|x86.ActiveCfg = Debug|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.Debug|x86.Build.0 = Debug|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.MonoDebug|Any CPU.ActiveCfg = MonoDebug|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.MonoDebug|Any CPU.Build.0 = MonoDebug|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.MonoDebug|x86.ActiveCfg = MonoDebug|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.MonoDebug|x86.Build.0 = MonoDebug|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.MonoRelease|Any CPU.ActiveCfg = MonoRelease|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.MonoRelease|Any CPU.Build.0 = MonoRelease|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.MonoRelease|x86.ActiveCfg = MonoRelease|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.MonoRelease|x86.Build.0 = MonoRelease|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.Release|Any CPU.ActiveCfg = Release|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.Release|Any CPU.Build.0 = Release|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.Release|x86.ActiveCfg = Release|x86 - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1}.Release|x86.Build.0 = Release|x86 {E127FED3-01C0-41BA-BF83-D8DCDD827D6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E127FED3-01C0-41BA-BF83-D8DCDD827D6A}.Debug|Any CPU.Build.0 = Debug|Any CPU {E127FED3-01C0-41BA-BF83-D8DCDD827D6A}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -581,18 +547,6 @@ Global {EDF3E264-2D0F-4440-99FF-45D279A598A9}.Release|Any CPU.ActiveCfg = Release|Any CPU {EDF3E264-2D0F-4440-99FF-45D279A598A9}.Release|Any CPU.Build.0 = Release|Any CPU {EDF3E264-2D0F-4440-99FF-45D279A598A9}.Release|x86.ActiveCfg = Release|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.Debug|x86.ActiveCfg = Debug|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.MonoDebug|Any CPU.ActiveCfg = MonoDebug|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.MonoDebug|Any CPU.Build.0 = MonoDebug|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.MonoDebug|x86.ActiveCfg = Debug|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.MonoRelease|Any CPU.ActiveCfg = MonoRelease|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.MonoRelease|Any CPU.Build.0 = MonoRelease|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.MonoRelease|x86.ActiveCfg = Release|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.Release|Any CPU.Build.0 = Release|Any CPU - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8}.Release|x86.ActiveCfg = Release|Any CPU {211560C3-FDDF-46D6-AB0C-F3BC04B173B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {211560C3-FDDF-46D6-AB0C-F3BC04B173B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {211560C3-FDDF-46D6-AB0C-F3BC04B173B5}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -819,7 +773,6 @@ Global {4B7E35DF-1569-4346-B180-A09615723095} = {E944109B-0B7A-4ADE-8602-004CEFA5897D} {15B7F794-0BB2-4B66-AD78-4A951F1209B2} = {E944109B-0B7A-4ADE-8602-004CEFA5897D} {E8B18958-7C8A-4FBA-AF00-3041C34A20CE} = {E944109B-0B7A-4ADE-8602-004CEFA5897D} - {AA7F66EB-EC2C-47DE-855F-30B3E6EF2134} = {E944109B-0B7A-4ADE-8602-004CEFA5897D} {D79203C0-B672-4751-9C95-C3AB7D3FEFBE} = {E944109B-0B7A-4ADE-8602-004CEFA5897D} {B795886D-9D70-45B1-BFB5-AD54CBC9A447} = {E944109B-0B7A-4ADE-8602-004CEFA5897D} {BD72B98D-C81A-4013-B606-94B4BA2273E5} = {E944109B-0B7A-4ADE-8602-004CEFA5897D} @@ -836,7 +789,6 @@ Global {98940A30-1B48-4F71-A6BA-85F0AAF31A2F} = {4A24657F-9695-437B-9702-2541ED280628} {EF660223-4DFD-4E36-BF36-9DD6AFB3F837} = {4A24657F-9695-437B-9702-2541ED280628} {28F9EA8B-90F7-4974-BB40-0B7FA9309D02} = {4A24657F-9695-437B-9702-2541ED280628} - {0B3EA40E-F7D8-4E14-A30F-1536F41B62D1} = {4A24657F-9695-437B-9702-2541ED280628} {E127FED3-01C0-41BA-BF83-D8DCDD827D6A} = {4A24657F-9695-437B-9702-2541ED280628} {948A8EF6-D50C-45EA-9AFD-7A4723ADAB0B} = {4A24657F-9695-437B-9702-2541ED280628} {1258BFCD-3BAD-4373-B786-4D698EC3C157} = {4A24657F-9695-437B-9702-2541ED280628} @@ -851,7 +803,6 @@ Global {FBC35268-377B-4DBE-87E3-B22D1314BEC6} = {A427F9F8-0A6F-4EEA-837F-FCDAB6E7D4B3} {3F18F5DA-93E0-4513-8BF4-BC8EE5C4117C} = {A427F9F8-0A6F-4EEA-837F-FCDAB6E7D4B3} {EDF3E264-2D0F-4440-99FF-45D279A598A9} = {E944109B-0B7A-4ADE-8602-004CEFA5897D} - {CA24ED85-DD68-4C10-B80A-D81C6745FCB8} = {A427F9F8-0A6F-4EEA-837F-FCDAB6E7D4B3} {211560C3-FDDF-46D6-AB0C-F3BC04B173B5} = {E944109B-0B7A-4ADE-8602-004CEFA5897D} {B5E3586D-81DE-49C3-83BC-062684795127} = {4A24657F-9695-437B-9702-2541ED280628} {BAE74CD5-57C2-40E3-8F7A-EDE5721C2ACC} = {4A24657F-9695-437B-9702-2541ED280628}