internal static URI ParseInternal(string uriString, bool percentCharsEscaped, Context context, out CachedProtocolProvider cachedProtocolProvider) { var uri = new URI(); if (percentCharsEscaped) { uriString = uriString.Replace("%25", "%"); } var groups = Regex.Match(uriString, RegEx.Protocol).Groups; var protocolString = groups["proto"].Value; if (protocolString.StartsWith("-")) { protocolString = protocolString.Substring(1); } var tail = groups["tail"].Value; if (!ProtocolController.ProtocolProviders.TryGetValue(protocolString, out cachedProtocolProvider)) { uri.Error = new UnknownProtocol(protocolString); return(uri); } uri.ProtocolProvider = cachedProtocolProvider.ProtocolProvider; try { uri.Populate(cachedProtocolProvider.ProtocolProvider.GetUriComponents(tail, context)); } catch (Exception e) { uri.Error = e; } return(uri); }