Merge pull request #1936 from esdrubal/DotNetRelativeOrAbsolute
authorMarcos Henrich <marcoshenrich@gmail.com>
Sat, 29 Aug 2015 11:24:02 +0000 (12:24 +0100)
committerMarcos Henrich <marcoshenrich@gmail.com>
Sat, 29 Aug 2015 11:24:02 +0000 (12:24 +0100)
[System] UriKind.RelativeOrAbsolute workaround.

mcs/class/System/System/Uri.cs
mcs/class/System/Test/System/UriTest.cs

index a1417e99527c0bd59f0befff9246110310ab4080..be05c6dfc7d2df849b9c9aed91b93e47597a31c7 100644 (file)
@@ -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) {
index 1a261938e9c27227948d0bc9d15cb95daf461bbb..beebf4dfc5b1b547974c42da95cc52ce84ca7126 100644 (file)
@@ -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 ()