浏览代码

Merge pull request #1936 from esdrubal/DotNetRelativeOrAbsolute

[System] UriKind.RelativeOrAbsolute workaround.
Marcos Henrich 10 年之前
父节点
当前提交
bd52e33266
共有 2 个文件被更改,包括 24 次插入0 次删除
  1. 10 0
      mcs/class/System/System/Uri.cs
  2. 14 0
      mcs/class/System/Test/System/UriTest.cs

+ 10 - 0
mcs/class/System/System/Uri.cs

@@ -170,9 +170,16 @@ namespace System {
 			}
 		}
 
+		// When used instead of UriKind.RelativeOrAbsolute paths such as "/foo" are assumed relative.
+		const UriKind DotNetRelativeOrAbsolute = (UriKind) 300;
+
 		public Uri (string uriString, UriKind uriKind)
 		{
 			source = uriString;
+
+			if (uriString != null && uriKind == DotNetRelativeOrAbsolute)
+				uriKind = (uriString.StartsWith ("/", StringComparison.Ordinal))? UriKind.Relative : UriKind.RelativeOrAbsolute;
+
 			ParseUri (uriKind);
 
 			switch (uriKind) {
@@ -205,6 +212,9 @@ namespace System {
 				return;
 			}
 
+			if (uriKind == DotNetRelativeOrAbsolute)
+				uriKind = (uriString.StartsWith ("/", StringComparison.Ordinal))? UriKind.Relative : UriKind.RelativeOrAbsolute;
+
 			if (uriKind != UriKind.RelativeOrAbsolute &&
 				uriKind != UriKind.Absolute &&
 				uriKind != UriKind.Relative) {

+ 14 - 0
mcs/class/System/Test/System/UriTest.cs

@@ -1914,6 +1914,20 @@ namespace MonoTests.System
 			Assert.AreEqual ("id=1%262&sort=asc", escaped, "UriEscaped");
 		}
 
+		// When used, paths such as "/foo" are assumed relative.
+		static UriKind DotNetRelativeOrAbsolute = (Type.GetType ("Mono.Runtime") == null)? UriKind.RelativeOrAbsolute : (UriKind) 300;
+
+		[Test]
+		public void DotNetRelativeOrAbsoluteTest ()
+		{
+			var uri1 = new Uri ("/foo", DotNetRelativeOrAbsolute);
+			Assert.IsFalse (uri1.IsAbsoluteUri);
+			
+			Uri uri2;
+			Uri.TryCreate("/foo", DotNetRelativeOrAbsolute, out uri2);
+			Assert.IsFalse (uri2.IsAbsoluteUri);
+		}
+
 		[Test]
 		// Bug #12631
 		public void LocalPathWithBaseUrl ()