ParseNoExceptions is now using registered parsers when possible.
authorMarcos Henrich <marcos.henrich@xamarin.com>
Tue, 29 Jul 2014 06:20:46 +0000 (07:20 +0100)
committerMarcos Henrich <marcos.henrich@xamarin.com>
Tue, 29 Jul 2014 06:22:43 +0000 (07:22 +0100)
mcs/class/System/System/Uri.cs

index f89d89d7c3443bc1b90aad58724c56859a7ddda2..ebe6300959ede44cfb78d025a8441234436d842d 100644 (file)
@@ -1289,6 +1289,23 @@ namespace System {
                        if (!UriParseComponents.TryParseComponents (source, kind, out elements, out error))
                                return error;
 
+                       scheme = elements.scheme;
+                       var parser = UriParser.GetParser (scheme);
+                       if (parser != null && !(parser is DefaultUriParser)) {
+                               userinfo = Parser.GetComponents (this, UriComponents.UserInfo, UriFormat.UriEscaped);
+                               host = Parser.GetComponents (this, UriComponents.Host, UriFormat.UriEscaped);
+
+                               var portStr = Parser.GetComponents (this, UriComponents.StrongPort, UriFormat.UriEscaped);
+                               if (!string.IsNullOrEmpty (portStr))
+                                       port = int.Parse (portStr);
+
+                               path = Parser.GetComponents (this, UriComponents.Path | UriComponents.KeepDelimiter, UriFormat.UriEscaped);
+                               query = Parser.GetComponents (this, UriComponents.Query, UriFormat.UriEscaped);
+                               fragment = Parser.GetComponents (this, UriComponents.StrongPort, UriFormat.UriEscaped);
+
+                               return null;
+                       }
+
                        var formatFlags = UriHelper.FormatFlags.None;
                        if (UriHelper.HasCharactersToNormalize (uriString))
                                formatFlags |= UriHelper.FormatFlags.HasUriCharactersToNormalize;
@@ -1299,8 +1316,6 @@ namespace System {
                        if (elements.host != null)
                                formatFlags |= UriHelper.FormatFlags.HasHost;
 
-                       scheme = elements.scheme;
-
                        userinfo = elements.user;
 
                        if (elements.host != null) {