diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs
index 87b4c676b5..e730bafbdc 100644
--- a/src/Umbraco.Core/StringExtensions.cs
+++ b/src/Umbraco.Core/StringExtensions.cs
@@ -28,6 +28,17 @@ namespace Umbraco.Core
[UmbracoWillObsolete("Do not use this constants. See IShortStringHelper.CleanStringForSafeAliasJavaScriptCode.")]
public const string UmbracoInvalidFirstCharacters = "01234567890";
+ private static readonly char[] ToCSharpHexDigitLower = "0123456789abcdef".ToCharArray();
+ private static readonly char[] ToCSharpEscapeChars;
+
+ static StringExtensions()
+ {
+ var escapes = new[] { "\aa", "\bb", "\ff", "\nn", "\rr", "\tt", "\vv", "\"\"", "\\\\", "??", "\00" };
+ ToCSharpEscapeChars = new char[escapes.Max(e => e[0]) + 1];
+ foreach (var escape in escapes)
+ ToCSharpEscapeChars[escape[0]] = escape[1];
+ }
+
internal static string ReplaceNonAlphanumericChars(this string input, char replacement)
{
//any character that is not alphanumeric, convert to a hyphen
@@ -1085,5 +1096,46 @@ namespace Umbraco.Core
return source;
}
+
+ ///
+ /// Converts a literal string into a C# expression.
+ ///
+ /// Current instance of the string.
+ /// The string in a C# format.
+ public static string ToCSharpString(this string s)
+ {
+ if (s == null) return "";
+
+ // http://stackoverflow.com/questions/323640/can-i-convert-a-c-sharp-string-value-to-an-escaped-string-literal
+
+ var sb = new StringBuilder(s.Length + 2);
+ for (var rp = 0; rp < s.Length; rp++)
+ {
+ var c = s[rp];
+ if (c < ToCSharpEscapeChars.Length && '\0' != ToCSharpEscapeChars[c])
+ sb.Append('\\').Append(ToCSharpEscapeChars[c]);
+ else if ('~' >= c && c >= ' ')
+ sb.Append(c);
+ else
+ sb.Append(@"\x")
+ .Append(ToCSharpHexDigitLower[c >> 12 & 0x0F])
+ .Append(ToCSharpHexDigitLower[c >> 8 & 0x0F])
+ .Append(ToCSharpHexDigitLower[c >> 4 & 0x0F])
+ .Append(ToCSharpHexDigitLower[c & 0x0F]);
+ }
+
+ return sb.ToString();
+
+ // requires full trust
+ /*
+ using (var writer = new StringWriter())
+ using (var provider = CodeDomProvider.CreateProvider("CSharp"))
+ {
+ provider.GenerateCodeFromExpression(new CodePrimitiveExpression(s), writer, null);
+ return writer.ToString().Replace(string.Format("\" +{0}\t\"", Environment.NewLine), "");
+ }
+ */
+ }
+
}
}
diff --git a/src/Umbraco.Web/Routing/DomainAndUri.cs b/src/Umbraco.Web/Routing/DomainAndUri.cs
index ba13508812..ec3e52ff11 100644
--- a/src/Umbraco.Web/Routing/DomainAndUri.cs
+++ b/src/Umbraco.Web/Routing/DomainAndUri.cs
@@ -1,4 +1,5 @@
using System;
+using Umbraco.Core;
using umbraco.cms.businesslogic.web;
namespace Umbraco.Web.Routing
@@ -20,7 +21,16 @@ namespace Umbraco.Web.Routing
public DomainAndUri(Domain domain, string scheme)
{
Domain = domain;
- Uri = new Uri(UriUtility.TrimPathEndSlash(UriUtility.StartWithScheme(domain.Name, scheme)));
+ try
+ {
+ Uri = new Uri(UriUtility.TrimPathEndSlash(UriUtility.StartWithScheme(domain.Name, scheme)));
+ }
+ catch (UriFormatException)
+ {
+ var name = domain.Name.ToCSharpString();
+ throw new ArgumentException(string.Format("Failed to parse invalid domain: node id={0}, hostname=\"{1}\"."
+ + " Hostname should be a valid uri.", domain.RootNodeId, name), "domain");
+ }
}
///