From eeb305c74070cacfe585129a45ea8bc1e59f293f Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 1 Oct 2012 13:08:10 -0200 Subject: [PATCH] fix uQuery.GetNodeIdByUrl --- src/Umbraco.Core/UriExtensions.cs | 7 ++++++ .../Routing/uQueryGetNodeIdByUrlTests.cs | 23 ++++++++++++++++++- src/Umbraco.Web/UriUtility.cs | 6 +---- .../umbraco/uQuery/uQuery-Nodes.cs | 8 +++++-- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Core/UriExtensions.cs b/src/Umbraco.Core/UriExtensions.cs index 7a81c62a0b..ba9fd99f0f 100644 --- a/src/Umbraco.Core/UriExtensions.cs +++ b/src/Umbraco.Core/UriExtensions.cs @@ -96,5 +96,12 @@ namespace Umbraco.Core } return uri; } + + public static Uri MakeAbsolute(this Uri uri, Uri baseUri) + { + if (uri.IsAbsoluteUri) + throw new ArgumentException("Uri is already absolute.", "uri"); + return new Uri(baseUri.GetLeftPart(UriPartial.Authority) + uri.GetSafeAbsolutePath()); + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs b/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs index 33c4b44614..ff24b8b647 100644 --- a/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs +++ b/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs @@ -45,7 +45,7 @@ namespace Umbraco.Tests.Routing [TestCase(1175, "/home/sub-2")] [TestCase(1172, "/test-page")] - public void GetNodeIdByUrl_Not_Hiding_Top_Level(int nodeId, string url) + public void GetNodeIdByUrl_Not_Hiding_Top_Level_Absolute(int nodeId, string url) { var routingContext = GetRoutingContext(); Umbraco.Web.UmbracoContext.Current = routingContext.UmbracoContext; @@ -56,5 +56,26 @@ namespace Umbraco.Tests.Routing Assert.AreEqual(nodeId, global::umbraco.uQuery.GetNodeIdByUrl("http://example.com" + url)); } + + [TestCase(1046, "/home")] + [TestCase(1173, "/home/sub1")] + [TestCase(1174, "/home/sub1/sub2")] + [TestCase(1176, "/home/sub1/sub-3")] + [TestCase(1177, "/home/sub1/custom-sub-1")] + [TestCase(1178, "/home/sub1/custom-sub-2")] + [TestCase(1175, "/home/sub-2")] + [TestCase(1172, "/test-page")] + + public void GetNodeIdByUrl_Not_Hiding_Top_Level_Relative(int nodeId, string url) + { + var routingContext = GetRoutingContext(); + Umbraco.Web.UmbracoContext.Current = routingContext.UmbracoContext; + + ConfigurationManager.AppSettings.Set("umbracoUseDirectoryUrls", "true"); + ConfigurationManager.AppSettings.Set("umbracoHideTopLevelNodeFromPath", "false"); + Umbraco.Core.Configuration.UmbracoSettings.UseDomainPrefixes = false; + + Assert.AreEqual(nodeId, global::umbraco.uQuery.GetNodeIdByUrl(url)); + } } } diff --git a/src/Umbraco.Web/UriUtility.cs b/src/Umbraco.Web/UriUtility.cs index 921c860a53..c2c43a9e21 100644 --- a/src/Umbraco.Web/UriUtility.cs +++ b/src/Umbraco.Web/UriUtility.cs @@ -237,12 +237,8 @@ namespace Umbraco.Web if (!absolutePath.StartsWith("/")) throw new FormatException("The absolutePath specified does not start with a '/'"); - - var url = httpContext.Request.Url; - var port = url.Port != 80 ? (":" + url.Port) : String.Empty; - - return new Uri(String.Format("{0}://{1}{2}{3}", url.Scheme, url.Host, port, absolutePath)); + return new Uri(absolutePath, UriKind.Relative).MakeAbsolute(httpContext.Request.Url); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery-Nodes.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery-Nodes.cs index 20605737c2..6f959809ca 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery-Nodes.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery-Nodes.cs @@ -1,9 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Web; using System.Xml.XPath; using umbraco; using umbraco.NodeFactory; +using Umbraco.Core; namespace umbraco { @@ -200,7 +202,9 @@ namespace umbraco /// public static int GetNodeIdByUrl(string url) { - var uri = new System.Uri(url); + var uri = new Uri(url, UriKind.RelativeOrAbsolute); + if (!uri.IsAbsoluteUri) + uri = uri.MakeAbsolute(Umbraco.Web.UmbracoContext.Current.UmbracoUrl); uri = Umbraco.Web.UriUtility.UriToUmbraco(uri); var docreq = new Umbraco.Web.Routing.DocumentRequest(uri, Umbraco.Web.UmbracoContext.Current.RoutingContext);